You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

改动说明

  1. 用with语法管理文件句柄,不需要手动close,避免资源泄漏
  2. 写入后调用seek(0)把文件指针移到开头,再读取内容就能拿到完整的凭证信息
  3. 把读取到的内容按行拆分,整理成用户名对应密码的字典,完全避免错位匹配和子串匹配问题
  4. 输入的用户名密码加了strip()去掉首尾空格,避免输入时不小心多打空格导致校验失败
  5. 修正了原代码中最大尝试次数的提示错误,原代码会把当前尝试次数当成最大次数展示

内容的提问来源于stack exchange,提问作者Omegadude52

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 13:54:06