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

Python读取文件求最低成绩及统计记录数程序报错排查

问题分析与解决方案

你的代码存在几个关键问题,导致输出结果不符合预期:

1. 最低成绩初始值设置错误

你把smallest初始化为0,但文件中所有学生成绩都高于0,因此if smallest >= grade的条件永远不会触发,smallest始终保持初始值0。

2. 文件指针耗尽导致记录数错误

遍历文件内容后,文件指针已经移动到文件末尾,此时调用numbers.readlines()会返回空列表,导致counter结果为0。

3. 未捕获IO类错误

当前代码仅捕获了ValueError,但没有处理文件不存在、权限不足等文件读取相关的IO错误。

4. 未保存最低成绩对应的学生姓名

代码只记录了最低分数值,没有保存对应的学生姓名,无法输出完整的学生信息。


修正后的代码

smallest = float('inf')
smallest_name = ""
counter = 0

try:
    # 使用with语句自动管理文件生命周期,避免资源泄漏
    with open('students.txt', 'r') as numbers:
        for line in numbers:
            counter += 1
            clean_line = line.strip()
            # 跳过空行,避免分割报错
            if not clean_line:
                continue
            split_line = clean_line.split('-')
            # 处理格式错误的行
            if len(split_line) != 2:
                print(f"跳过格式无效的行: {clean_line}")
                continue
            name = split_line[0]
            try:
                grade = int(split_line[1])
            except ValueError:
                print(f"行{clean_line}中的成绩不是有效数字")
                continue
            # 更新最低成绩及对应学生
            if grade < smallest:
                smallest = grade
                smallest_name = name
except FileNotFoundError:
    print("错误:未找到students.txt文件")
except IOError:
    print("错误:读取文件时发生IO异常")

# 处理无有效记录的情况
if counter == 0:
    print("文件中没有有效学生记录")
else:
    print(f'最低成绩学生: {smallest_name} - {smallest}')
    print(f'记录总数: {counter}')

关键修改说明

  • 初始值优化:将smallest设为float('inf')(无穷大),确保第一个读取到的成绩会替换初始值
  • 文件管理:用with语句自动关闭文件,无需手动调用close(),代码更安全简洁
  • 记录计数:遍历文件时直接递增counter,避免重复读取文件导致的指针问题
  • 错误处理:新增文件相关错误捕获,同时在内部处理单条记录的格式/数值错误
  • 信息保存:新增smallest_name变量,同步记录当前最低成绩对应的学生姓名
  • 健壮性提升:跳过空行和格式错误的行,避免程序因无效数据崩溃

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 18:45:47