2014-02-28 41 views
0

我正在開發一個無意義的猜謎遊戲,以進行技能開發。我決定編寫代碼來從文件中讀取用戶和他們的分數,然後寫一個函數來檢查存在的用戶名當前是否已經在文件中:Python文件函數

import getpass 
user = getpass.getuser() 

def userExists(username): 
    f = open('score.txt', 'rU') 
    for line in f: 
     row = line.split('\r\n') 
     info = row[0].strip('\r\n').split(':') 
     username = info[0] 
     if user==username: 
      uExists = True 
      break 
     else: 
      uExists = False 
    return usExists 
    f.close() 

起初我有返回值,TrueFalse內導致問題的循環,所以我設置了一個變量值和return

score.txt貌似和使用的格式:

user:10:50 
userB:5:10 

但每當我使用此功能userExists('nonExistingUser')它始終如果用戶存在與否返回True不管,任何想法我做錯了嗎?

+2

您正在覆蓋'用戶名'變量。應該做用戶=信息[0]而不是 – Javier

回答

0

你的邏輯有點混亂,所以首先我介紹其操作應(如果我是正確的)是幾乎相同稍微清理後的版本。

import getpass 
user = getpass.getuser() 

def userExists(username): 
    f = open('score.txt', 'rU') 
    for line in f: 
     username = line.rstrip().split(':')[0] 
     if user==username: 
      return True 
    return False 
    f.close() 

rstrip()方法調用返回而沒有任何尾隨空格相同的字符串; split()調用返回由冒號分隔的三個字符串的列表,並且您已知道[0]做了什麼.標誌變爲不必要的。我推測你想從行尾刪除所有空白區域?

這確實有一個不幸的問題,即該文件永遠不會關閉(就像您的建議代碼一​​樣)。一個相對容易(但相當先進)的解決方法是使用該文件作爲上下文管理器。

import getpass 
user = getpass.getuser() 

def userExists(username): 
    with open('score.txt', 'rU') as f: 
     for line in f: 
      username = line.rstrip().split(':')[0] 
      if user==username: 
       return True 
     return False 

這確保了無論功能如何返回文件將無需顯式調用其close()方法正確關閉。

+0

現在完美的作品謝謝,雖然認爲你犯了一個錯字,你把循環線而不是線? – user3366103

+0

好眼睛!謝謝,你會看到我已經做出了更正。 – holdenweb

+0

有兩行包含兩行中的rline,你只改變了一個lol – user3366103

0

除了什麼哈維爾指出,你還設置uExists但返回usExists它應該是沿着這些路線:

def userExists(username): 
    f = open('score.txt', 'rU') 
    uExists = False 
    for line in f: 
     row = line.split('\r\n') 
     info = row[0].strip('\r\n').split(':') 
     if user==info[0]: 
      uExists = True 
      break 
     else: 
      uExists = False 
    f.close() 
    return uExists 

根據您的Python版本,我還看入with statement清理那f.close()

0

您可以簡化userExists像這樣:

def userExists(username): 
    with open('score.txt','rU') as score: 
     return username+':' in score.read() 

您不妨使用正則表達式,而不是用戶名+「:」與with聲明

0

使用的文件,這樣的文件會被自動關閉當您退出with區塊時,即使您留下異常或return聲明。

def userExists(username): 
    with open('score.txt', 'rU') as f: 
     for line in f: 
      if line[:line.find(':')] == username: 
       return True 
    return False