You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 已成功生成")

优化建议

  1. 函数拆分:把读取文件、计算等级、写入报告等逻辑拆分成独立函数,让代码更易读和维护,比如示例中的calculate_grade函数。
  2. 异常扩展:除了FileNotFoundError,还可以添加对非整数成绩的ValueError捕获,避免因数据格式错误崩溃。
  3. 命名规范:统一使用小写或驼峰命名,避免大小写混乱(代码中统一用小写键名,写入时转换为题目要求的格式)。
  4. 注释补充:关键步骤添加注释,方便后续回顾和调试。

内容的提问来源于stack exchange,提问作者Showtunes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 11:01:08