简易注册登录程序读取文件时仅获用户名前2字符而非第2行的问题
问题解决:登录时无法正确读取第二行密码
核心问题
你代码里的file.readline(2)理解错了用法:readline()的参数是读取的最大字符数,不是行号。所以它会从当前文件指针位置(开头)读取前2个字符,也就是第一行用户名的前两位,自然拿不到第二行的密码。
修复后的登录代码
下面是修正后的登录逻辑,同时做了几个实用优化:
- 用
with语句自动管理文件,避免手动关闭文件的疏漏 - 先读取第一行(用户名),再读取第二行获取密码
- 增加文件不存在的异常处理,提示用户用户名错误
- 替换递归登录为循环,避免多次错误尝试导致栈溢出
import time print("To login you'll need to type your username first") def login(): while True: userName = input("username: ") filename = userName + ".txt" try: with open(filename, "r") as file: # 读取第一行用户名(可忽略,也可用来二次校验) file.readline() # 读取第二行密码,用strip()去掉换行符和多余空格 realPassWord = file.readline().strip() passWord = input("password: ") if passWord == realPassWord: print("successfully logged in ") break else: print("incorrect password, please try again") except FileNotFoundError: print(f"User {userName} does not exist, please check your username") login()
同时修正注册代码的小问题
你的注册代码里file.close少了括号,应该是file.close(),否则文件不会被正确关闭,可能导致内容未写入。同样建议用with语句简化代码:
import time def registracia(): print("To register you'll need to type your username and your password.") time.sleep(1.5) userName = input("username: ") time.sleep(1.5) passWord = input("password: ") filename = userName + ".txt" # with语句会自动关闭文件,无需手动调用close() with open(filename, "w") as file: file.write(userName + "\n") file.write(passWord) if __name__ == "__main__": registracia()
补充说明
readline()不带参数时会读取整一行内容,包括末尾的换行符,用strip()可以去掉换行符和前后空格,避免输入密码时因为隐藏的换行符导致匹配失败- 循环登录比递归更安全,多次错误尝试后不会触发Python的递归深度限制
- 异常处理能明确提示用户问题出在用户名还是密码,提升程序的友好性
内容的提问来源于stack exchange,提问作者totmom
相关产品推荐
相关产品推荐

