如何用Python高效清洗大型CSV文件?
处理大型CSV文件的日期清洗与高效过滤方案
处理大型CSV时,全量加载数据到内存是拖慢速度、导致内存溢出的核心问题。你的原代码把所有数据读进列表再处理,对大文件极不友好。下面是基于流式处理的优化方案,能以最短时间完成清洗,同时避免内存压力:
核心优化思路
- 流式处理:逐行读取、清洗、写入,全程不把所有数据存进内存
- 用标准库
datetime做日期校验,比手动拆分判断更准确(自动处理闰年、不同月份天数等边界情况) - 一次遍历完成清洗+过滤,避免二次遍历的时间开销
优化后的代码
import csv from datetime import datetime # 输入输出文件路径 INPUT_CSV = "data.csv" OUTPUT_CSV = "cleaned_data.csv" # 定义目标日期格式 DATE_FORMAT = "%Y-%m-%d" with open(INPUT_CSV, "r", newline="") as infile, open(OUTPUT_CSV, "w", newline="") as outfile: reader = csv.DictReader(infile) writer = csv.DictWriter(outfile, fieldnames=reader.fieldnames) writer.writeheader() for row in reader: date_str = row.get("date", "").strip() if not date_str: continue # 跳过日期为空的行 try: # 解析并验证日期合法性 date_obj = datetime.strptime(date_str, DATE_FORMAT) # 格式化回标准字符串(确保统一格式,比如补零) row["date"] = date_obj.strftime(DATE_FORMAT) writer.writerow(row) except ValueError: # 格式错误或无效日期,直接跳过该行 continue
代码说明
- 流式读写:用
csv.DictReader逐行读取输入文件,处理完一行就直接用csv.DictWriter写入输出文件,内存占用始终保持在单行数据的量级 - 日期校验:
datetime.strptime会自动验证日期的合法性——比如2024-02-30这种无效日期会直接抛出ValueError,无需手动判断月份天数、闰年等复杂逻辑 - 高效过滤:遇到空日期或无效日期的行直接跳过,不写入输出文件,一次遍历完成所有操作
对比原代码的优势
- 原代码把全量数据存入列表,GB级CSV会直接导致内存不足;流式处理无此问题
- 原代码需要两次遍历(清洗日期+过滤行),优化后仅需一次遍历,时间开销减半
- 日期校验逻辑更严谨,不会出现手动判断漏判的情况(比如2月29日的闰年处理)
内容的提问来源于stack exchange,提问作者stroxx
相关产品推荐
相关产品推荐

