Python读取TSV文件计算学生成绩及平均分报错求助
问题分析与调试方案
1. 核心错误:KeyError: 0 的根源
csv.DictReader 会将每行TSV数据解析为字典,键是文件第一行的表头字段名,而非数字索引。你用row[0]这类数字索引访问字典,自然会因找不到对应键抛出KeyError: 0。
2. 其他常见问题修正
- 变量未初始化:提前定义存储结果的容器(如列表、字符串),避免运行时出现“未定义变量”报错。
- 拼写错误:严格检查表头字段名、变量名的拼写(比如把
Midterm1写成Midterm,或输出文件名写错),字典的键对大小写、拼写完全敏感。
3. 修正后的完整代码示例
假设你的TSV表头为 Last Name、First Name、Midterm1、Midterm2、Final,以下是可运行的修正代码:
import csv def generate_score_report(input_tsv, output_txt): # 初始化存储结果的列表 report_content = [] # 读取TSV文件,指定分隔符为制表符\t with open(input_tsv, 'r', newline='', encoding='utf-8') as tsv_file: # DictReader自动以第一行作为字典键 reader = csv.DictReader(tsv_file, delimiter='\t') for row in reader: # 用表头字段名访问字典值,确保和表头拼写完全一致 last_name = row['Last Name'] first_name = row['First Name'] mid1 = float(row['Midterm1']) mid2 = float(row['Midterm2']) final_score = float(row['Final']) # 计算成绩统计(可根据需求调整) total = mid1 + mid2 + final_score average = total / 3 # 格式化单条学生记录 student_line = f"姓名:{first_name} {last_name}\n" \ f"期中1:{mid1:.1f} | 期中2:{mid2:.1f} | 期末:{final_score:.1f}\n" \ f"总分:{total:.1f} | 平均分:{average:.1f}\n" \ "-------------------------\n" report_content.append(student_line) # 写入结果文件 with open(output_txt, 'w', encoding='utf-8') as txt_file: txt_file.writelines(report_content) # 替换为你的实际文件名 generate_score_report('students.tsv', 'score_report.txt')
4. TSV示例数据验证
假设你的TSV数据如下(注意用制表符分隔列):
Last Name First Name Midterm1 Midterm2 Final
Smith John 85 90 92
Doe Jane 78 82 88
运行代码后,score_report.txt会生成格式化的学生成绩记录。
5. 实用调试技巧
- 打印
reader.fieldnames,查看DictReader识别到的表头,确认字段名拼写、大小写完全匹配。 - 循环中打印单条
row,直观查看字典的键值对,确保要访问的字段确实存在。
内容的提问来源于stack exchange,提问作者H K
相关产品推荐
相关产品推荐

