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

从两个文件读写数据:学生成绩平均值计算编程问题

解决学生姓名与对应成绩平均值的文件生成问题

首先咱们明确核心需求:你有两个文本文件,nomesAlunos.txt存储学生姓名,nomesNotas.txt存储对应学生的成绩组,需要生成一个新文件,让每个学生姓名后紧跟自己的成绩平均值。

初始代码的问题分析

你最初的代码有两个关键问题,直接导致了输出内容混乱:

  1. 成绩计算逻辑错误:把所有成绩当成一个整体计算总平均值,而非按每个学生对应的成绩组分别计算平均
  2. 格式与匹配错误:没有拆分姓名列表,直接写入整行姓名后连续拼接平均值,导致所有内容挤在一起,既没有换行也没有正确的对应关系

修正后的代码及解释

下面是你提供的已解决代码,我帮你整理并拆解关键步骤:

# 打开输出文件与两个输入文件
final = open('data/notasFinal.txt', 'w')
nomes = open('data/nomesAlunos.txt')
notas = open('data/nomesNotas.txt')

media = []  # 存储每个学生的成绩平均值
i = 0       # 用于匹配学生与对应平均值的索引

# 第一步:遍历成绩文件,预计算所有学生的平均值
for linhas in notas:
    lista = linhas.split()  # 将每行成绩拆分为单个成绩的列表
    # 计算当前行成绩的平均值并存入media列表
    media.append(sum(int(numeros) for numeros in lista) / len(lista))

# 第二步:遍历姓名文件,将姓名与对应平均值匹配写入
for nome in nomes:
    alunos = nome.split()  # 将整行姓名拆分为单个学生姓名的列表
    # 逐个取出学生姓名,与media中对应索引的平均值格式化写入
    for aluno in alunos:
        final.write(f"{aluno:30}{media[i]}\n")
        i += 1

# 关闭所有打开的文件
nomes.close()
notas.close()
final.close()

关键修正点说明:

  • 预计算平均值:先遍历成绩文件,把每个学生的成绩组平均值提前计算好存入media列表,确保每个索引对应一个学生的平均成绩
  • 姓名与平均值一一匹配:拆分姓名列表后,用索引i逐个对应media中的平均值,保证每个学生对应自己的成绩平均
  • 格式化输出:使用f"{aluno:30}{media[i]}\n"让姓名占30个字符宽度,后续紧跟平均值,且每个学生单独占一行,输出格式整齐规范

可选优化建议

为了更安全地管理文件(避免忘记关闭文件),推荐使用with语句自动管理文件上下文,代码更简洁可靠:

with open('data/notasFinal.txt', 'w') as final, \
     open('data/nomesAlunos.txt') as nomes, \
     open('data/nomesNotas.txt') as notas:
    
    media = []
    for linhas in notas:
        lista = linhas.split()
        media.append(sum(int(n) for n in lista) / len(lista))
    
    i = 0
    for nome_line in nomes:
        alunos = nome_line.split()
        for aluno in alunos:
            final.write(f"{aluno:30}{media[i]}\n")
            i += 1

这样无需手动调用close()方法,Python会自动在代码块结束后关闭所有文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:38:56