在我的情况下,我正在创建一个寄存器,它需要通过使用CSV将登录凭据存储到外部文件中。
我有两个问题:
它不会循环代码3次并在之后关闭。如果你一直弄错了,它会永远循环它,即使是不是第一个但是正确的登录凭据。如果第一个登录凭证正确,则它将停止循环并退出。我认为这是因为上面的第一个问题。
with open("login_credential.txt","r") as login_credential:
for x in range (0,2):
inputted_username = input("Please enter your username - ")
inputted_password = input("Please enter your password - ")
login_credentialReader = csv.DictReader(login_credential)
for lines in login_credentialReader:
if lines["username"].lower() == inputted_username and lines["password"].lower() == inputted_password:
print("Welcome...")
sys.exit()
elif lines["username"].lower() != inputted_username or lines["password"].lower() != inputted_password:
x += 1
print("Login credentials are incorrect. Please try again.")
login()
if x >= 3:
print("Too many incorrect tries...")
sys.exit
这是我的外部文件(login_credential.txt)中的内容:
的用户名,密码,名,姓,一年
14JeoJun,海鸥,Jungkook,全度妍2014
13ParJim,excuseme,济民,公园,2013
10KimNam,gotjams,Namjoon,Kim,2010
每当我切换到第一个时,只有第一个会起作用。
答案 0 :(得分:0)
读取文件一次后,文件句柄将关闭,您无法再次读取它。特别是,请看这里:
with open("login_credential.txt","r") as login_credential: for x in range (0,2): inputted_username = input("Please enter your username - ") inputted_password = input("Please enter your password - ") login_credentialReader = csv.DictReader(login_credential) for lines in login_credentialReader: # ... # ...
在for x in range(...)
循环的第二次迭代中,
文件句柄login_credential
已被完全读取,
它不会再被重读,
所以内部for循环的主体不会被执行。
此代码还存在其他严重问题。
例如,在for x in range(...)
循环中,
你不应该修改循环体内x
的值。
它可能不会像你想象的那样工作,
因为在下一次迭代中,x
将重置为来自range(...)
的下一个值。不要这样做。
一个小问题,看看这些条件:
if lines["username"].lower() == inputted_username and lines["password"].lower() == inputted_password: # ... elif lines["username"].lower() != inputted_username or lines["password"].lower() != inputted_password: # ...
第二个条件与第一个条件相反。
这是毫无意义的,您可以用简单的elif
替换长else
。
根据一般方法, 而不是在用户每次重试用户名/密码时重新读取密码文件, 最好只读取一次文件的行,然后重复使用它。 这将需要更多内存,但节省I / O. 这可能是一个很好的权衡。
它可能是这样的:
with open("login_credential.txt","r") as login_credential:
login_credentialReader = csv.DictReader(login_credential)
lines = [line for line in login_credentialReader]
for x in range(2):
inputted_username = input("Please enter your username - ")
inputted_password = input("Please enter your password - ")
# ...
答案 1 :(得分:0)
你目前正在做的是检查每一行,如果它匹配则是否匹配。
需要做的只是检查行,如果匹配,如果不匹配 - 请尝试下一行。只有当文件中的任何一行都不匹配时,您才需要说出错误的凭据 - 该行在循环之后。