我想用python 3.5创建一个简单的登录系统。它的作用是打开一个包含用户名和密码的文档。该文档在第一行有一个用户名,在第二行有该用户的密码。这将继续通过文档,导致每个奇数行上的用户名和每个偶数行上的密码。循环遍历所有20行(对于10个用户)并将每个奇数行作为用户名,并将每个偶数行作为密码。它通过,并检查用户名和密码是否正确。由于某种原因,它不起作用,它只是要求输入用户名,输入密码,并没有返回任何东西。它正在打开文档,因为它在我打印出用户名和密码时起作用。
username = input('please enter your username')
password = input('please unter your password')
for i in range(0,20,2):
text_file = open('users.txt','r')
database = text_file.readlines()
if username == database[i] and password == database[i+1]:
print('login accepted')
else:
if username == database[i] and password != database[i+1]:
print('incorrect password')
text_file.close()
答案 0 :(得分:1)
可能的问题更多地与字符串剥离有关。您有机会获得如下文本文件:
myusername
mypassword
otherusername
otherpassword
当你正在阅读它时,你会得到:
["myusername\n", "mypassword\n", ... ]
您最有可能通过在从文件读取的每一行上使用str.strip
来解决此问题。
但是你有比这更多的逻辑错误。这是一个:
for i in range(0, 20, 2):
text_file = open(...)
database = text_file.readlines()
# you really want to open the file and read from it EVERY SINGLE LOOP??
还有:
if username == database[i] or password == database[i+1]:
# log in if your password is ANYONE'S password, or if your username
# is ANYONE'S username.
在宏观方案中,您应该预处理文本文件以创建键值对字典。
database = {} # empty dict
with open('path/to/textfile.txt') as inf:
while True:
try:
username = next(inf)
password = next(inf)
except StopIteration:
break
else:
database[username.strip()] = password.strip()
username_in = input("What's your username? ")
password_in = input("What's your password? ")
if database[username_in] == password_in:
# login successful
但是真的,你永远不应该出于任何原因以纯文本形式存储密码。好主人,伙计,对密码存储做一些研究! :)
答案 1 :(得分:0)
Answer by Adam Smith很棒。 我只能添加该行
if database[username_in] == password_in:
如果您的数据库中没有此类用户名,可能会导致KeyError
。您可能要在检查密码或检查try except
块中的密码检查或使用dict.get(key, default)
方法从数据库中获取密码之前检查数据库中是否存在用户名
这里有一些代码:
# Pre check
if username_in in database.keys():
if database[username_in] == password_in:
# ...
else:
# No such username in database
# try .. except
try:
if database[username_in] == password_in:
# ...
except KeyError:
# No such username in database
# get with default
# if no default is specified, default is None
if database.get(username_in) == password_in: