注册函数因CSV文件问题失效,sorted_dict返回空列表求助
问题排查与修复方案
核心问题分析
1. sorted_dict为空的直接原因
- 文件为空/不存在:如果
hashpy.csv是空文件,或者程序当前工作目录下找不到该文件,csv.DictReader会返回空迭代器,sorted()后自然得到空列表。 - 表头缺失
login字段:如果hashpy.csv的第一行(表头)没有login列名,DictReader生成的字典不会包含'login'键,执行sorted(reader, key=lambda k: k['login'])会抛出KeyError,但你未提及报错,大概率是文件为空或路径问题。 - 代码缩进错误:原代码中
with open("hashpy.csv") as f:缩进层级错误,会导致语法报错,你能运行说明实际代码已修正,但这个问题必须注意。
2. 注册逻辑的致命缺陷
原代码循环逻辑完全错误:遍历sorted_dict时,第一行就执行注册并直接return,如果sorted_dict为空(文件无内容),循环根本不会执行,直接跳出函数回到菜单,这就是你遇到的现象。注册的正确逻辑应该是先检查输入的登录名是否已存在,不存在再执行写入操作,而非循环已有行触发注册。
修复后的代码
import csv import uuid import hashlib # 假设input_str是你定义的输入验证函数 def input_str(prompt, error_msg): while True: s = input(prompt) if 4 <= len(s) <= 20: return s print(error_msg) def reg(r) -> None: loginnn = input_str("Create login:\n", "login must be made of 4 - 20 symbols") file_name2 = "hashpy.csv" # 明确文件名,避免未定义变量 login_exists = False # 检查登录名是否已存在 try: with open(file_name2, 'r', newline='') as f: reader = csv.DictReader(f, delimiter=',') for row in reader: if row.get('login') == loginnn: login_exists = True break except FileNotFoundError: # 文件不存在,说明是第一次注册,无需检查 pass if login_exists: print("Login already exists!") return # 执行注册流程 passworddd = input_str("Create password:\n", "password must be made of 4 - 20 symbols") salt = uuid.uuid4().hex print(f"{salt} salt") # 修复哈希逻辑:使用用户输入的密码,转成字符串写入文件 hashed_password = hashlib.sha256(passworddd.encode() + salt.encode()).hexdigest() print(hashed_password) print("Registration is successful!") # 写入文件,首次注册自动写入表头 with open(file_name2, 'a', newline='') as f: writer = csv.DictWriter(f, fieldnames=['login', 'password', 'salt', 'role']) # 检查文件是否为空,为空则先写表头 f.seek(0, 2) if f.tell() == 0: writer.writeheader() writer.writerow({ 'login': loginnn, 'password': hashed_password, 'salt': salt, 'role': r })
关键修复点
- 修正缩进错误,确保代码语法合法。
- 新增登录名重复检查逻辑,符合注册功能正常流程。
- 处理文件不存在的情况,首次注册自动创建文件并写入表头。
- 修复密码哈希错误:原代码误用未定义的
password变量,改为用户输入的passworddd,同时调用hexdigest()将哈希对象转为可写入的字符串。 - 明确
file_name2定义,避免未定义变量报错。
内容的提问来源于stack exchange,提问作者slsforme
相关产品推荐
相关产品推荐

