Python成绩处理代码循环异常原因分析及优化方案
问题分析
代码核心问题
- 行处理逻辑错误:
line.strip('\n').split('\n')属于冗余操作,按行读取的line只需用strip()去除首尾空白即可,用split('\n')会把单行内容包装成单元素列表,导致后续数据处理混乱——并非循环只执行一次,而是处理后的数据格式错误让你产生了误解。 - 字典键无序匹配:用集合
{'学号','平时成绩','期末成绩'}作为字典键,集合是无序结构,zip时会随机匹配键值对,大概率出现成绩读取错误的情况。 - 文件写入逻辑错误:每次循环用
'w'模式打开score2.txt会覆盖之前的内容;且writelines无法直接写入字典,需要拼接成指定字符串格式。 - 未完成统计需求:缺少分数段统计、总平均分计算及结果输出的逻辑。
优化后的代码
# 初始化统计变量 total_students = 0 score_ranges = { "90分及以上": 0, "80~89分": 0, "70~79分": 0, "60~69分": 0, "60分以下": 0 } total_score = 0.0 # 同时读取源文件、写入目标文件 with open(r"C:\Users\GioGio\Desktop\score1.txt", 'r') as f_read, \ open(r"score2.txt", 'w') as f_write: for line in f_read: # 去除首尾空白并按空格分割字段,跳过空行 parts = line.strip().split() if not parts: continue # 解构字段到变量 student_id, usual_score, final_score = parts # 计算综合成绩并取整 usual_score = int(usual_score) final_score = int(final_score) comprehensive_score = round(0.4 * usual_score + 0.6 * final_score) # 写入score2.txt f_write.write(f"{student_id} {comprehensive_score}\n") # 更新统计数据 total_students += 1 total_score += comprehensive_score # 统计分数段 if comprehensive_score >= 90: score_ranges["90分及以上"] += 1 elif 80 <= comprehensive_score <= 89: score_ranges["80~89分"] += 1 elif 70 <= comprehensive_score <= 79: score_ranges["70~79分"] += 1 elif 60 <= comprehensive_score <= 69: score_ranges["60~69分"] += 1 else: score_ranges["60分以下"] += 1 # 输出统计结果 print(f"班级总人数:{total_students}") print("分数段统计:") for range_name, count in score_ranges.items(): print(f"- {range_name}:{count}人") if total_students > 0: average_score = round(total_score / total_students, 1) print(f"班级总平均分:{average_score}") else: print("班级无有效成绩数据")
优化说明
- 数据读取:用
strip()+split()处理每行数据,同时跳过空行避免报错,保证数据格式正确。 - 文件操作:一次性打开源文件和目标文件,避免重复打开关闭文件,提升效率且不会覆盖已有内容。
- 统计逻辑:处理每行数据时同步更新统计变量,最后统一计算平均分并格式化输出,完成所有需求。
- 避免键无序问题:直接解构分割后的字段到变量,无需依赖字典,彻底避免键值匹配错误。
内容的提问来源于stack exchange,提问作者anyemoka
相关产品推荐
相关产品推荐

