与用户输入相比,用户登录从文件中读取失败
User login read from file failing compared to user input
我正在编写一个程序来验证用户名:
def user_login():
""" Login and create a username, maybe """
with open('username.txt', 'r') as f:
if f.readline() is "":
username = raw_input("First login, enter a username to use: ")
with open('username.txt', 'a+') as user:
user.write(username)
else:
login_id = raw_input("Enter username: ")
if login_id == str(f.readline()):
return True
else:
print "Invalid username."
return False
if __name__ == '__main__':
if user_login() is not True:
print "Failed to verify"
每次我运行它输出如下:
Enter username: tperkins91
Invalid username.
Failed to verify
如何将用户输入与从文件中读取进行比较?
在另一个嵌套上下文中再次打开同一个文件不是一个好主意。相反,在 append 模式下打开文件一次,并在需要时使用 f.seek(0)
到 return 开始:
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"
您可能需要考虑在 if
分支中返回布尔值,因此函数的 return 类型与布尔值一致,而不是 None
当前情况。
第一次使用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()
作为防御措施。
我正在编写一个程序来验证用户名:
def user_login():
""" Login and create a username, maybe """
with open('username.txt', 'r') as f:
if f.readline() is "":
username = raw_input("First login, enter a username to use: ")
with open('username.txt', 'a+') as user:
user.write(username)
else:
login_id = raw_input("Enter username: ")
if login_id == str(f.readline()):
return True
else:
print "Invalid username."
return False
if __name__ == '__main__':
if user_login() is not True:
print "Failed to verify"
每次我运行它输出如下:
Enter username: tperkins91
Invalid username.
Failed to verify
如何将用户输入与从文件中读取进行比较?
在另一个嵌套上下文中再次打开同一个文件不是一个好主意。相反,在 append 模式下打开文件一次,并在需要时使用 f.seek(0)
到 return 开始:
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"
您可能需要考虑在 if
分支中返回布尔值,因此函数的 return 类型与布尔值一致,而不是 None
当前情况。
第一次使用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()
作为防御措施。