Python处理TSV文件计算成绩:代码问题与优化求助
Python学生成绩处理实验解决方案
疑问解答
A. 用字典存储学生信息的思路是否可行?
完全可行。推荐用列表嵌套字典的结构,每个字典对应一名学生的所有信息(姓名、各科成绩、等级),这种结构既直观又方便后续遍历和数据提取。结合csv模块的DictReader可以直接把TSV文件的每行转换成字典,能大幅简化代码。
B. 如何提取字典中特定键的所有值计算平均分?
假设你有存储所有学生信息的列表students,每个元素是包含midterm1、midterm2、final键的字典,可用列表推导式提取对应键的所有值,再计算平均分:
# 提取所有学生的Midterm1成绩 midterm1_scores = [student['midterm1'] for student in students] # 计算平均分(保留两位小数) midterm1_avg = round(sum(midterm1_scores) / len(midterm1_scores), 2)
修正后的完整代码
import csv def calculate_grade(average): """根据平均分计算等级""" if average >= 90: return 'A' elif average >= 80: return 'B' elif average >= 70: return 'C' elif average >= 60: return 'D' else: return 'F' # 1. 读取用户输入的TSV文件名 filename = input("请输入TSV文件名:").strip() # 2. 读取学生信息并处理 students = [] try: with open(filename, 'r', newline='', encoding='utf-8') as tsvfile: # 指定TSV分隔符为制表符\t,定义字段名对应列 reader = csv.DictReader(tsvfile, delimiter='\t', fieldnames=['lastName', 'firstName', 'midterm1', 'midterm2', 'final']) for row in reader: # 将成绩字符串转换为整数 row['midterm1'] = int(row['midterm1']) row['midterm2'] = int(row['midterm2']) row['final'] = int(row['final']) # 3. 计算学生平均分和等级 avg_score = (row['midterm1'] + row['midterm2'] + row['final']) / 3 row['grade'] = calculate_grade(avg_score) students.append(row) except FileNotFoundError: print(f"错误:未找到文件 {filename}") exit() # 4. 计算每门考试的平均分 if students: midterm1_avg = round(sum(s['midterm1'] for s in students) / len(students), 2) midterm2_avg = round(sum(s['midterm2'] for s in students) / len(students), 2) final_avg = round(sum(s['final'] for s in students) / len(students), 2) else: print("错误:文件中没有学生数据") exit() # 5. 写入report.txt with open('report.txt', 'w', newline='', encoding='utf-8') as reportfile: writer = csv.writer(reportfile, delimiter='\t') # 写入表头 writer.writerow(['lastName', 'firstName', 'Midterm1', 'Midterm2', 'Final', 'Grade']) # 写入每个学生的信息 for student in students: writer.writerow([ student['lastName'], student['firstName'], student['midterm1'], student['midterm2'], student['final'], student['grade'] ]) # 6. 写入每门考试的平均分 writer.writerow([]) # 空行分隔 writer.writerow(['Midterm1平均分:', midterm1_avg]) writer.writerow(['Midterm2平均分:', midterm2_avg]) writer.writerow(['Final平均分:', final_avg]) print("report.txt 已成功生成")
优化建议
- 函数拆分:把读取文件、计算等级、写入报告等逻辑拆分成独立函数,让代码更易读和维护,比如示例中的
calculate_grade函数。 - 异常扩展:除了
FileNotFoundError,还可以添加对非整数成绩的ValueError捕获,避免因数据格式错误崩溃。 - 命名规范:统一使用小写或驼峰命名,避免大小写混乱(代码中统一用小写键名,写入时转换为题目要求的格式)。
- 注释补充:关键步骤添加注释,方便后续回顾和调试。
内容的提问来源于stack exchange,提问作者Showtunes
相关产品推荐
相关产品推荐

