You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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")

关键改进点说明

  1. 安全的文件操作:用with语句打开文件,Python会自动在代码块结束后关闭文件,避免资源泄漏
  2. 只读取一次文件:全程只打开一次test.txt,遍历所有行完成筛选,效率更高
  3. 记录格式校验:检查分割后的字段数量,避免因无效记录导致的IndexError,同时给出明确的警告信息
  4. 可读性优化:用清晰的变量名、字典存储记录,输出时格式化展示,让结果更直观
  5. 灵活的匹配逻辑:通过lower()实现用户名的大小写不敏感匹配,比如用户输入QWE也能匹配到记录
  6. 友好的结果提示:无论是否找到记录,都给出明确的反馈,提升用户体验

另外,顺便提一下你补充代码里的小问题:比如hisHFile.write应该是hisMediumFile.write,循环里的hisWw2应该是hisEasy,这些变量名不一致的问题会导致代码运行报错,需要注意统一哦。

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

火山引擎 最新活动