Python中CSV文件处理的常见累积错误及修正方案
在使用 Python 的 csv 模块处理学生成绩数据时一个极易被忽视却影响结果准确性的典型问题是变量作用域与重用逻辑错误。如原始代码所示grades [] 被定义在 for row in reader: 循环外部导致每次迭代都将新学生的成绩追加到同一个列表中——而非为每位学生独立初始化。结果是第二位学生的平均分 第一位所有成绩 第二位所有成绩的均值第三位则继续累加……最终输出的“每人平均分”实为不断膨胀的全局累计均值完全偏离业务本意。正确做法是确保每个学生对应独立的数据上下文。以下为优化后的完整实现复制AI写代码123456789101112131415161718192021222324import 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(score.strip())forscore in row[1:]ifscore.strip()]ifnot grades:raise ValueError(f无有效成绩数据: {row})avg_score mean(grades)results.append([name, f{avg_score:.1f}]) # 保留一位小数格式统一except (ValueError, TypeError)ase:print(f警告跳过异常行 {row} — {e})continue# 容错处理不中断整个流程with open(output_file_name,w, newline)asoutfile:writer csv.writer(outfile)writer.writerows(results)✅关键改进说明作用域修正grades 现定义于循环体内确保每次迭代均为新列表类型安全显式使用 float() 转换并捕获 ValueError避免字符串如 N/A 或空字段引发崩溃空值防御通过 if score.strip() 过滤空白成绩项if not row 跳过空行可读性提升变量命名语义化infile/outfile、results、移除冗余 OrderedDict普通二维列表更轻量且 CSV 本身无序需求输出规范f{avg_score:.1f} 统一保留一位小数兼顾精度与可读性错误处理策略采用非阻断式警告print continue保障批量处理稳定性。⚠️注意事项若输入 CSV 含表头如 Name,Math,English,Science需在 for row in reader: 前添加 next(reader) 跳过首行对于超大文件建议使用生成器或 pandas 配合 chunksize 提升内存效率生产环境应补充日志记录如 logging 模块替代 print便于追踪异常若成绩字段含单位如 85%需先正则清洗再转换。该方案不仅修复了核心逻辑缺陷更以工程化思维强化了健壮性、可维护性与可扩展性是处理类似逐行聚合类 CSV 任务的推荐范式。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2471242.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!