从两个文件读写数据:学生成绩平均值计算编程问题
解决学生姓名与对应成绩平均值的文件生成问题
首先咱们明确核心需求:你有两个文本文件,nomesAlunos.txt存储学生姓名,nomesNotas.txt存储对应学生的成绩组,需要生成一个新文件,让每个学生姓名后紧跟自己的成绩平均值。
初始代码的问题分析
你最初的代码有两个关键问题,直接导致了输出内容混乱:
- 成绩计算逻辑错误:把所有成绩当成一个整体计算总平均值,而非按每个学生对应的成绩组分别计算平均
- 格式与匹配错误:没有拆分姓名列表,直接写入整行姓名后连续拼接平均值,导致所有内容挤在一起,既没有换行也没有正确的对应关系
修正后的代码及解释
下面是你提供的已解决代码,我帮你整理并拆解关键步骤:
# 打开输出文件与两个输入文件 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
相关产品推荐
相关产品推荐

