注册测验算法;程序不检查用户名是否已存在



>我正在创建一个测验算法,该算法可以实用程序登录系统。对于注册过程,用户名和密码存储在文本文件中,并被读取以查看它们是否已存在。如果是这种情况,则会告诉用户用户名或密码已经存在,并重复此操作,直到输入尚不存在的内容。发生这种情况时,将附加文本文件以添加用户名。但是,由于某种原因,程序不会检查用户尝试是否已经在文本文件中,而只是将其添加到文本文件中,即使它已经存在。

登录过程执行检查变量和文本文件中的字符串是否相同的第一部分,工作正常。程序检查用户名和密码是否在文件中,如果是登录。散列代码用于测试,并在程序工作时删除。

##Sign up
if Option == ("2"):
exit = False
while exit == False:
Userattempt = input("Please enter a username:n>>> ")
file = open("Usernames.txt","r")
searchline = file.readline()
Flag = False
Username = ""
for line in file:
print(Userattempt, line)# used to see how the program goes through each line
Username = str(line)
if Userattempt == Username:
Flag = True
print("Yes", Userattempt, line)# Used to test after each line
else:
print("False")# Used to test after each line
if Flag == True:
print("That Username already exists, Please try another")
else:
#file.close()
file = open("Usernames.txt","a")
file.write(Userattempt)
file.write("n")
print("Okay",Userattempt, "is your username")
exit = True
file.close()

该程序运行良好,但由于某种原因,它不会检查用户输入是否等于每行,如果等于,则用于捕获用户名或密码已存在的标志不会更改。

它不起作用的主要原因是你没有从从文件中读取的行中删除换行符,所以它永远不会与用户输入匹配。

程序逻辑还有其他问题。您不应该在for循环中写入新用户名,因为在到达文件末尾之前,您不知道用户名是否可用。

您可以使用for循环的else:块代替Flag变量。如果循环正常完成而不是从break语句完成,这将运行。然后,在文件中查找匹配行时break出循环。\

通常最好使用with语句打开文件,并在完成后自动关闭它。

##Sign up
if Option == ("2"):
while True:
Userattempt = input("Please enter a username:n>>> ")
with open("Usernames.txt","r") as file:
for line in file:
Username = line.strip()
print(Userattempt, Username)# used to see how the program goes through each line
if Userattempt == Username:
print("That Username already exists, Please try another")
break # break out of for-loop
else: # name not found, so add it
with open("Usernames.txt","a") as outfile:
outfile.write(Userattempt)
outfile.write("n")
print("Okay",Userattempt, "is your username")
break # break out of while-loop

最新更新