Python实现文本文件存取用户名密码时校验失败问题求解
问题根因
- 第一个问题:文件读写指针位置错误。你使用
r+模式打开文件写入内容后,文件指针会停留在写入内容的末尾,此时执行saveFile.read()读取到的是空字符串,所以uap变量里没有任何凭证内容,校验自然永远失败。 - 第二个问题:校验逻辑存在缺陷。当前只是单独判断用户名和密码是否存在于文本中,会出现两个严重问题:一是用户名和密码错位也能通过校验(比如你存了用户A密码B,输入用户B密码A也会匹配成功);二是子串匹配错误(比如你存的用户是
admin,输入ad也会被判断为用户名存在)。 - 第三个小问题:你每次运行程序都会追加写入新的凭证,没有去重逻辑,后续凭证多了会加大匹配混乱的概率。
修复代码
import time import sys # 写入凭证部分 text1 = input("\n Write username ") text2 = input("\n Write password ") # 用a+模式追加写入,写入后主动把指针移到文件开头再读取 with open('usernames+passwords', 'a+', encoding='utf-8') as saveFile: saveFile.write(f'{text1}\n{text2}\n') saveFile.seek(0) content = saveFile.read().splitlines() # 把凭证整理成字典,避免错位匹配,键是用户名,值是密码 credential = {} for i in range(0, len(content), 2): if content[i].strip() and i+1 < len(content): credential[content[i].strip()] = content[i+1].strip() max_attempts = 3 attempts = 0 while True: username = input("Username: ").strip() password = input("Password: ").strip() # 校验时严格匹配字典的键值对 if username in credential and credential[username] == password: print("Access Granted") break else: attempts += 1 if attempts >= max_attempts: print(f"reached max attempts of {max_attempts} ") sys.exit() print("Try Again (10 sec)") time.sleep(10)
改动说明
- 用
with语法管理文件句柄,不需要手动close,避免资源泄漏 - 写入后调用
seek(0)把文件指针移到开头,再读取内容就能拿到完整的凭证信息 - 把读取到的内容按行拆分,整理成用户名对应密码的字典,完全避免错位匹配和子串匹配问题
- 输入的用户名密码加了
strip()去掉首尾空格,避免输入时不小心多打空格导致校验失败 - 修正了原代码中最大尝试次数的提示错误,原代码会把当前尝试次数当成最大次数展示
内容的提问来源于stack exchange,提问作者Omegadude52
相关产品推荐
相关产品推荐

