Python文本文件搜索优化:如何输出指定用户的所有测试记录
优化代码以输出指定用户的所有测试记录
看起来你的代码目前存在几个逻辑和资源管理上的问题,比如重复打开文件、循环逻辑混乱,导致无法正确输出用户的所有测试记录。下面是优化后的实现方案,我会一步步解释改进点:
原代码的核心问题
- 循环内重复打开
test.txt,不仅浪费资源,还会打断遍历流程,无法继续处理后续的记录 - 没有用安全的文件操作方式,容易出现文件未关闭的情况
- 缺少对无效记录的校验,比如格式错误的行可能导致索引越界
- 变量命名混乱,比如
userRecord[2]赋值给user却未使用,降低了代码可读性
优化后的完整代码
def report(user_entry): # 使用with语句自动管理文件生命周期,无需手动调用close() with open("test.txt", "r") as test_file: matched_records = [] for line_num, line in enumerate(test_file, 1): # 去除首尾空白(包括换行符),跳过空行 cleaned_line = line.strip() if not cleaned_line: continue # 分割记录,按分号分隔 record_parts = cleaned_line.split(';') # 校验记录格式是否符合预期(5个字段) if len(record_parts) != 5: print(f"警告:第{line_num}行记录格式无效,已跳过:{cleaned_line}") continue # 解构字段,用更清晰的变量名 username, subject, unit, score, grade = record_parts # 匹配目标用户(支持大小写不敏感,可根据需求关闭) if username.lower() == user_entry.lower(): # 将记录整理成字典,提升可读性 matched_records.append({ "用户名": username, "科目": subject, "单元": unit, "分数": score, "等级": grade }) # 输出结果 if matched_records: print(f"=== 用户「{user_entry}」的所有测试记录 ===") for idx, record in enumerate(matched_records, 1): print(f"{idx}. 科目:{record['科目']} | 单元:{record['单元']} | 分数:{record['分数']} | 等级:{record['等级']}") else: print(f"未找到用户「{user_entry}」的任何测试记录") # 调用示例:传入当前登录的用户名 report("qwe")
关键改进点说明
- 安全的文件操作:用
with语句打开文件,Python会自动在代码块结束后关闭文件,避免资源泄漏 - 只读取一次文件:全程只打开一次
test.txt,遍历所有行完成筛选,效率更高 - 记录格式校验:检查分割后的字段数量,避免因无效记录导致的
IndexError,同时给出明确的警告信息 - 可读性优化:用清晰的变量名、字典存储记录,输出时格式化展示,让结果更直观
- 灵活的匹配逻辑:通过
lower()实现用户名的大小写不敏感匹配,比如用户输入QWE也能匹配到记录 - 友好的结果提示:无论是否找到记录,都给出明确的反馈,提升用户体验
另外,顺便提一下你补充代码里的小问题:比如hisHFile.write应该是hisMediumFile.write,循环里的hisWw2应该是hisEasy,这些变量名不一致的问题会导致代码运行报错,需要注意统一哦。
内容的提问来源于stack exchange,提问作者qwe




