2016-08-31 3 views
1

私は、ユーザー名を確認するプログラムを書いているユーザー入力に比べ不合格私はユーザー入力とファイルからの読み込みを比較しますか?ユーザーログインは

答えて

1

別のネストされたコンテキストで同じファイルを再度開くことはお勧めできません。その代わり、追記モードで一度ファイルを開き、必要にいつでもスタートに戻るには、f.seek(0)を使用します。ifブランチのbool値を返す

def user_login(): 
    """ Login and create a username, maybe """ 
    with open('username.txt', 'a+') as f: 
     if f.readline() is "": 
      username = raw_input("First login, enter a username to use: ") 
      f.seek(0) 
      f.write(username) 
      # return True/False --> make the function return a bool in this branch 
     else: 
      login_id = raw_input("Enter username: ") 
      f.seek(0) 
      if login_id == f.readline(): 
       return True 
      else: 
       print "Invalid username." 
       return False 


if __name__ == '__main__': 
    if user_login() is not True: 
     print "Failed to verify" 

は、あなたがそうリターンを検討する必要がありますものですあなたの関数の型はboolと一貫していて、現在の場合のようにNoneではありません。

+0

甘い!ありがとうございました!私はかなりPythonの笑に新しいです –

1

readline()を初めて使用すると、現在のファイルの位置が最初のレコードを超えて移動されます。ファイル内に存在する場合、

import os.path 
import sys 

def user_login(): 
    fname = 'username.txt' 

    """ Login and create a username, maybe """ 
    if os.path.getsize(fname) == 0: 

     with open(fname, 'w') as f: 
      username = raw_input("First login, enter a username to use: ") 
      f.write(username) 
      return True #/False --> make the function return a bool in this branch 
    else: 
     with open(fname, 'r') as f: 
      login_id = raw_input("Enter username: ") 
      if login_id == f.readline().rstrip(): 
       return True 
      else: 
       print >>sys.stderr, "Invalid username." 
       return False 


if __name__ == '__main__': 
    if user_login() is not True: 
     print "Failed to verify" 

f.readline()の末尾に改行が含まれますraw_input()はしません一方:ファイルが空の場合は見つけるためのより良い方法は、それの大きさをテストすることです。明示的に書き込むのではないが、誰かがファイルを編集して改行を意図せず追加することがあるため、防御上の予防策としてrstrip()を追加してください。

関連する問題