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

简易注册登录程序读取文件时仅获用户名前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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 22:16:31