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

