如何正确计算 CSV 文件中每行学生成绩的平均值
本文详解 python 中使用 csv 模块处理学生成绩数据时常见的累积错误并提供结构清晰、健壮可靠的解决方案重点解决因变量作用域不当导致的平均值计算失真问题。在使用 Python 的 csv 模块逐行读取学生成绩文件如 students.csv并计算每人平均分时一个极易被忽视却影响结果准确性的典型错误是将存储成绩的列表如 grades定义在循环外部。这会导致前一行的成绩未被清空持续累积到后续行的计算中最终所有平均值均基于全部历史数据而非单个学生造成严重逻辑偏差。以下是一个修复后的完整实现兼顾可读性、健壮性与 Python 最佳实践复制AI写代码1234567891011121314151617181920212223242526import csvfrom statistics import meandef calculate_averages(input_file_name, output_file_name):results []with open(input_file_name, newline)asinfile:reader csv.reader(infile)forrow in reader:ifnot row: # 跳过空行增强鲁棒性continuename row[0].strip() # 去除姓名首尾空格try:# 使用列表推导式安全转换成绩为浮点数grades [float(value.strip())forvalue in row[1:]ifvalue.strip()]ifnot grades:raise ValueError(f无有效成绩数据: {row})avg_score mean(grades)# 格式化为保留一位小数的字符串提升输出可读性results.append([name, f{avg_score:.1f}])except (ValueError, TypeError)ase:raise ValueError(f解析失败姓名: {name}: {e}) from e# 统一写入输出文件避免嵌套 with 语句with open(output_file_name,w, newline)asoutfile:writer csv.writer(outfile)writer.writerows(results)关键改进说明✅作用域修正grades 现定义于 for row in reader: 循环内部确保每次迭代都创建全新列表彻底杜绝跨行数据污染✅类型安全转换使用 float() 替代 int()兼容小数成绩如 89.5并通过 strip() 处理可能的空白字符✅异常处理升级保留必要错误捕获但抛出带上下文信息的 ValueError便于调试定位问题行而非静默退出✅空行与空字段防护显式跳过空行并过滤掉空字符串成绩项避免 float() 报错✅输出精简高效直接使用 writer.writerows(results) 批量写入替代多次 writerow取消 OrderedDict无重复姓名前提下纯属冗余✅格式统一规范f{avg_score:.1f} 确保所有平均分以一致的小数位数呈现符合教育场景常见要求。使用示例假设输入文件 input.csv 内容如下复制AI写代码123Alice,85,92,78Bob,90,88,94,87Charlie,76,82调用 calculate_averages(input.csv, output.csv) 后output.csv 将生成复制AI写代码123Alice,85.0Bob,89.8Charlie,79.0请务必注意CSV 解析本质是文本处理任何依赖“行内结构固定”的逻辑都应辅以数据校验。生产环境中建议进一步结合 pandas 或添加 Schema 验证但对轻量级脚本上述方案已兼顾简洁性与可靠性。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2471802.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!