为何For循环仅迭代一次?TSV学生成绩处理代码问题排查
问题排查:Python读取TSV生成成绩报告时循环仅执行一次的问题
问题场景
读取StudentInfo.tsv中的学生成绩数据,生成包含字母等级与平均分的报告文件,但代码中的For循环仅迭代一次,最终输出为[],无法达到预期效果。
输入输出示例
输入的StudentInfo.tsv内容
Barrett Edan 70 45 59 Bradshaw Reagan 96 97 88 Charlton Caius 73 94 80 Mayo Tyrese 88 61 36 Stern Brenda 90 86 45
预期输出
Barrett Edan 70 45 59 F Bradshaw Reagan 96 97 88 A Charlton Caius 73 94 80 B Mayo Tyrese 88 61 36 D Stern Brenda 90 86 45 C Averages: midterm1 83.40, midterm2 76.60, final 61.60
当前问题代码
import csv def calculate_grade(average_score): if average_score >= 90: return 'A' elif 80 <= average_score < 90: return 'B' elif 70 <= average_score < 80: return 'C' elif 60 <= average_score < 70: return 'D' else: return 'F' tsv_input = str(input()) student_data = [] with open(tsv_input) as file_a: tsv_read = file_a.readlines() for row in tsv_read: student_data = [row.strip().split('\t')] with open('report.txt', 'a+') as final_file: for info in student_data: last_name, first_name, midterm1, midterm2, final = info average_score = (float(midterm1) + float(midterm2) + float(final)) / 3 final_grade = calculate_grade(average_score) final_file.write(f'{last_name}\t{first_name}\t{midterm1}\t{midterm2}\t{final}\{final_grade}\n') final_read = final_file.readlines() print(final_read)
问题排查与修复
核心问题点
- 列表赋值错误:读取TSV行的循环中,
student_data = [row.strip().split('\t')]每次都会覆盖整个列表,而非追加元素,导致student_data仅保留最后一行数据,循环自然只执行一次。 - 空行未处理:输入TSV中存在空行,直接分割会生成空列表,后续解构赋值会触发报错。
- 文件读取位置错误:
a+模式打开文件后,指针默认在文件末尾,直接调用readlines()会读取到空内容,因此输出[]。 - 平均分逻辑缺失:原代码未计算三门考试的整体平均分,也未将其写入报告。
- 字符串转义错误:写入语句中的
\{final_grade}多了一个反斜杠,会导致格式错误。
修正后的代码
def calculate_grade(average_score): if average_score >= 90: return 'A' elif 80 <= average_score < 90: return 'B' elif 70 <= average_score < 80: return 'C' elif 60 <= average_score < 70: return 'D' else: return 'F' tsv_input = input() student_data = [] # 初始化平均分统计变量 midterm1_total = 0.0 midterm2_total = 0.0 final_total = 0.0 student_count = 0 with open(tsv_input) as file_a: for row in file_a.readlines(): stripped_row = row.strip() # 跳过空行 if not stripped_row: continue # 适配输入中的空格分隔(原示例为空格而非制表符) data = stripped_row.split() student_data.append(data) # 累加分数用于计算整体平均分 midterm1_total += float(data[2]) midterm2_total += float(data[3]) final_total += float(data[4]) student_count += 1 # 计算三门考试的整体平均分 avg_midterm1 = midterm1_total / student_count avg_midterm2 = midterm2_total / student_count avg_final = final_total / student_count with open('report.txt', 'w') as final_file: # 写入每个学生的成绩与等级 for info in student_data: last_name, first_name, midterm1, midterm2, final = info average_score = (float(midterm1) + float(midterm2) + float(final)) / 3 final_grade = calculate_grade(average_score) final_file.write(f'{last_name}\t{first_name}\t{midterm1}\t{midterm2}\t{final}\t{final_grade}\n') # 写入空行和平均分信息 final_file.write('\n') final_file.write(f'Averages: midterm1 {avg_midterm1:.2f}, midterm2 {avg_midterm2:.2f}, final {avg_final:.2f}\n') # 读取并打印报告内容验证结果 with open('report.txt', 'r') as f: print(f.read())
修复说明
- 将列表赋值改为
student_data.append(data),实现数据追加,保留所有学生行数据。 - 添加空行判断逻辑,跳过输入中的空行,避免后续报错。
- 改用
w模式写入文件(覆盖写入,避免多次运行重复追加内容),若需追加可保留a+但需在读取前调用final_file.seek(0)移动指针到文件开头。 - 修复字符串转义错误,删除多余的反斜杠。
- 添加整体平均分统计逻辑,计算并写入三门考试的平均分信息。
内容的提问来源于stack exchange,提问作者Christina Wurschum
相关产品推荐
相关产品推荐

