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
相关产品推荐
相关产品推荐

