2017-10-17 7 views
1

私はログインしてユーザー名とパスワードを作成するコードを実行しています。ログインすると、すべてのユーザー名とパスワードを辞書形式で含む外部ファイルを読み込みます。 {「AAAAAAAA」:「aaaaaaA999」}特定の入力用のファイルを読むPython

私は試してみて、それを読んだとき、これはそれを

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が返されます。

名前またはパスワードがファイル全体に存在するかどうかをチェックする代わりに、ファイルを実際に解析して包含を検索できるデータ構造にする必要があります。 2人のユーザーが同じパスワードを持っているとどうなりますか?ファイル全体で単一の文字列を検索しているだけの場合は、指定されたユーザー名に対してパスワードが正しいことを確認していません。例えば

は、あなたのファイルを仮定すると、次のようになります。

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)に変更しました。より信頼性の高いリソース管理を行うには、これを行う必要があります。 、あなたが1つでも理解にユーザー/パスワード辞書の作成を凝縮でき

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") 

:あなたも、そしておそらく代わりにif X in Yのチェック辞書を処理するために例外を使用して辞書生成dictionary comprehensionを行うことにより、更なる改善を行うことができしかし、私はそれが何のメリットも無く大幅に読みやすさを妨げていると思います。

0

あなたが問題を抱えている理由はこれです:あなたが初めてf3.read()を使用する場合、それは最後にポインタを移動します

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

、あなたはせずに、再びそれを読むことができません再開。だから、

、あなたがファイルを読み出した第1の時間がそれを読んで解析することができ、このような何か:

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 

との声明がより良い例外処理を提供し、自動的にファイルを閉じて、任意のクリーンアップありません必要があります

関連する問題