如何阻止重复用户名写入.txt文件?代码部分重复校验失效求助
问题原因
你的代码有两个核心问题:
- 注册逻辑嵌套错误:把用户注册的
while True循环放在了读取文件的for lines循环内部,导致程序读取第一行用户(admin)后就直接进入注册流程,根本没机会读取后续的用户(user),自然无法拦截user的重复提交。 - 存在性判断错误:用
x in alr_exists[keys]来判断用户名是否存在,这是在检查输入的用户名是否是当前读取的那个用户名的子串,而不是检查是否在所有已存在的用户名列表里。比如读取admin时,这个判断只能匹配包含admin的字符串,完全没用到整个alr_exists字典的所有键。
修复后的代码
alr_exists = {} # 先一次性读取所有已存在的用户名到字典中 with open('user.txt', 'r') as file: for line in file: # 按逗号分割,处理原数据中逗号后带空格的情况 key, value = line.strip().split(', ') alr_exists[key.lower()] = value.lower() # 统一转小写,避免大小写重复 while True: x = input("要注册新用户,请输入用户名:\n").lower() if x in alr_exists: print(f'抱歉,用户名{x}已被占用,请重新输入。\n') continue # 密码确认逻辑 y = input("请输入密码:\n").lower() z = input("请再次输入密码确认:\n").lower() if y != z: print("两次输入的密码不一致,请重新操作。\n") continue # 写入新用户到文件 with open('user.txt', 'a') as file: file.write(f"{x}, {y}\n") alr_exists[x] = y # 更新已存在用户字典,避免本次运行中重复注册 print("注册成功!\n") # 可选:添加是否继续注册的判断 cont = input("是否继续注册新用户?(y/n)\n").lower() if cont != 'y': break
关键修改说明
- 拆分读取与注册逻辑:先完整读取所有历史用户到
alr_exists字典,再进入注册循环,确保所有已存在用户都被纳入校验范围。 - 修正存在性判断:用
x in alr_exists直接检查输入用户名是否在字典键中,覆盖所有已存在用户的校验。 - 补充密码一致性校验,以及写入文件后更新
alr_exists的步骤,避免同一次运行内重复注册同一用户。 - 处理了原数据中逗号后带空格的分割问题,避免读取到无效空格。
内容的提问来源于stack exchange,提问作者Cluelesspython
相关产品推荐
相关产品推荐

