2017-10-17 66 views
1

因此,我正在做一個代碼登錄並創建一個用戶名和密碼,並在登錄時,我正在閱讀一個外部文件,其中包含所有用戶名和密碼的字典形式,例如{「AAAAAAAA」:「aaaaaaA999」}讀取文件的某些輸入蟒蛇

這是代碼讀它

f3 = open("helloworld.txt","r") 
user = input("Enter login name: ") 

if user in f3.read(): 
    passw = input("Enter password: ") 
    print("") 

    if user in f3.read() and passw in f3.read(): 
     print ("Login successful!\n") 


    else: 
     print("") 
     print("User doesn't exist!\n") 
f3.close() 

然而,當我試着讀它口口聲聲說該用戶不存在,任何建議

+0

'read()'只在你第一次這樣做時才起作用。 –

+0

如果您要以字典形式保存所有用戶名和密碼,您可以考慮將其保存爲json文件並將其加載到字典中,以便您可以加載文件並檢查用戶名是否存在,如果是,則密碼爲正確。 https://docs.python.org/3/library/json.html –

回答

2

函數f3.read()正在讀取整個文件,並將文件指針移至末尾。讀取任何後續文件而不關閉並重新打開文件將返回None

您需要將文件實際解析爲數據結構,以便您可以搜索包含,而不是檢查整個文件中是否存在名稱或密碼。如果兩個用戶擁有相同的密碼會發生什麼?如果您只是在整個文件中搜索單個字符串,則無法確保給定用戶名的密碼正確。

例如,假設你的文件看起來是這樣的:

username1,password1 
username2,password2 
username3,password3 

你解析代碼應該打開和讀取該文件,並檢查遏制不用每次都搜索整個文件:

users = {} 

with open("helloworld.txt") as f3: 
    for line in f3: 
     name, password = line.split(",") 
     users[name] = password.strip() 

user = input("Enter login name: ") 

if user in users: 
    passw = input("Enter password: ") 
    print() 

    if passw == users[user]: 
     print("Login successful!") 

    else: 
     print("Bad password") 

else: 
    print("Bad username") 

請注意,我已將文件更改爲打開以使用context manager(關鍵字with)。您應該這樣做,以獲得更可靠的資源管理。你也可以將通過使字典生成一個dictionary comprehension進一步改進,並可能通過使用異常處理字典檢查,而不是if X in Y

with open("helloworld.txt") as f3: 
    pairs = (line.split(",") for line in f3) 
    users = {name:password.strip() for name, password in pairs} 

user = input("Enter login name: ") 
passw = input("Enter password: ") 

try: 
    if passw == users[user]: 
     print("Login successful!") 
    else: 
     print("Bad password") 
except KeyError: 
    print("Bad username") 

你甚至可以凝聚的用戶名/密碼字典制作成一個單一的理解,但我認爲這會顯着阻礙可讀性而沒有任何好處。

0

您遇到的問題的原因是這樣的:

if user in f3.read() and passw in f3.read(): 

當您使用f3.read()首次將鼠標指針移動到結束,你將無法讀取它無需再次重新開放。

所以,你可以讀取並解析它在第一次讀取的文件,像這樣:

import ast 
# since you're storing the credentials in a dict format 
# ast.literal_eval can be used to parse the str to dict 
creds = ast.literal_eval(f3.read()) 
if user in creds and creds[user] == passw: 
    #login success 

的重新讀取文件內容的另一種方式,而無需調用f3.read()前重新打開它會調用f3.seek(0) 。這將移動指針重新開始,但以上更適合您的情況。

0

最好是當你讀取和寫入數據,使用「與」語句到文件中,像這樣:

with open("helloworld.txt","r") as f3: 
    # Read user data 
    user_data = f3.read() 

    # Verify username and password are right 

with語句提供了更好的異常處理和自動關閉文件和做任何清理必需