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

CSV存储注册信息后登录验证出现KeyError: 'username'问题求助

问题排查与修复方案

错误原因

出现KeyError: 'username'的核心问题是:你写入CSV文件的注册数据没有表头行,而csv.DictReader默认会把文件的第一行当作列名(表头)解析。当你用row['username']访问时,因为没有对应的表头,自然找不到这个键。

另外你的登录验证逻辑还有两个问题:

  • 循环中每遍历一行不匹配就立刻更新错误提示,会导致即使后面有匹配的行,用户也会先看到错误提示
  • 无论登录成功与否,最后都会无条件关闭登录窗口,不符合交互逻辑

修复步骤

1. 修复注册数据写入逻辑(添加表头)

修改save_sign_up函数,在第一次写入数据时先写入表头行,后续追加数据时只写内容:

import os

def save_sign_up():
    forename = forename_text.get()
    dob = dob_text.get()
    username = username_text.get()
    password = password_text.get()

    # 检查文件是否存在,不存在则先写入表头
    file_exists = os.path.isfile("sign_up.csv")
    with open("sign_up.csv", "a") as writer:
        if not file_exists:
            # 写入表头,列名要和后续读取时的键完全一致
            writer.write("forename,dob,username,password\n")
        # 写入用户数据,移除逗号后的空格避免匹配失败
        writer.write(f"{forename},{dob},{username},{password}\n")

    sign_up_window.destroy()

2. 修复登录验证逻辑

调整save_login函数,循环结束后再判断是否登录成功,仅在成功时关闭窗口:

import csv

def save_login():
    username = username_text.get().strip()  # 去除输入首尾空格
    password = password_text.get().strip()

    login_success = False
    with open('sign_up.csv', mode='r') as file:
        cfile = csv.DictReader(file)
        for row in cfile:
            if username == row['username'] and password == row['password']:
                review_label.config(text="Login successful!")
                login_window.destroy()
                login_success = True
                break

    # 循环结束后未匹配到有效数据,提示错误
    if not login_success:
        review_label.config(text="Invalid username or password. Please try again.")

额外注意事项

  • 确保CSV表头列名和DictReader访问的键完全一致(大小写、空格都不能错)
  • 生产环境中不要明文存储密码,建议使用hashlib对密码哈希后再存储

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 18:47:51