Python读写文件问题:读取学生数据并生成统计输出文件遇阻
解决Python读取学生分数并输出统计结果的问题
我来帮你搞定这个问题!首先咱们得先明确input.txt的格式,举个实际的例子会更清晰:
3
2
Alice 85 90
Bob 78 82
Charlie 92 88
上面的示例里,第一行是3个学生,第二行是每个学生有2门考试分数,后面每行对应一个学生的姓名和分数。接下来咱们一步步实现完整的功能:
步骤1:读取并解析输入文件
首先要打开input.txt,按行读取内容,然后解析出学生数量、分数数量,以及每个学生的信息。这里要注意处理文件读取的异常,比如文件不存在的情况。
步骤2:计算所需统计数据
- 计算每个学生的总分和个人平均分(可选,如果你需要的话)
- 计算班级所有分数的平均分
步骤3:将结果写入output.txt
把班级平均分、每个学生的姓名和分数(以及个人统计数据)按清晰的格式写入输出文件。
完整的Python代码
def process_scores(input_file, output_file): try: # 读取输入文件,过滤空行 with open(input_file, 'r', encoding='utf-8') as f: lines = [line.strip() for line in f if line.strip()] # 解析基础信息 student_count = int(lines[0]) score_count_per_student = int(lines[1]) # 初始化统计变量 total_all_scores = 0 student_data = [] # 处理每个学生的成绩数据 for line in lines[2:2+student_count]: parts = line.split() name = parts[0] scores = list(map(int, parts[1:1+score_count_per_student])) # 计算个人总分与平均分 student_total = sum(scores) student_avg = student_total / score_count_per_student # 累加班级总分 total_all_scores += student_total # 存储学生信息 student_data.append({ 'name': name, 'scores': scores, 'total': student_total, 'avg': student_avg }) # 计算班级整体平均分 class_avg = total_all_scores / (student_count * score_count_per_student) # 写入输出文件 with open(output_file, 'w', encoding='utf-8') as f: f.write(f"班级平均分: {class_avg:.2f}\n\n") f.write("学生成绩详情:\n") for student in student_data: f.write(f"姓名: {student['name']}\n") f.write(f"分数: {' '.join(map(str, student['scores']))}\n") f.write(f"个人总分: {student['total']}, 个人平均分: {student['avg']:.2f}\n\n") print("处理完成,结果已写入output.txt") except FileNotFoundError: print(f"错误:未找到文件 {input_file}") except ValueError: print("错误:输入文件格式不正确,请检查内容是否符合要求") except Exception as e: print(f"发生未知错误: {e}") # 调用函数执行处理 process_scores('input.txt', 'output.txt')
代码说明
- 使用
with open()语句确保文件自动关闭,避免资源泄漏 - 先过滤空行,避免解析时出现格式错误
- 对分数做字符串转整数的类型转换,保证计算逻辑正常
- 平均分保留两位小数,让输出结果更美观易读
- 加入异常处理,捕获文件不存在、格式错误等常见问题,避免程序直接崩溃
示例output.txt内容
运行代码后,output.txt会生成如下格式的内容:
班级平均分: 85.83
学生成绩详情:
姓名: Alice
分数: 85 90
个人总分: 175, 个人平均分: 87.50姓名: Bob
分数: 78 82
个人总分: 160, 个人平均分: 80.00姓名: Charlie
分数: 92 88
个人总分: 180, 个人平均分: 90.00
如果你的input.txt格式和示例略有差异(比如分数用逗号分隔),只需要调整split()的参数,比如改成split(',')后再处理多余空格即可。
内容的提问来源于stack exchange,提问作者Calvin
相关产品推荐
相关产品推荐

