You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

代码说明

  1. 流式读写:用csv.DictReader逐行读取输入文件,处理完一行就直接用csv.DictWriter写入输出文件,内存占用始终保持在单行数据的量级
  2. 日期校验:datetime.strptime会自动验证日期的合法性——比如2024-02-30这种无效日期会直接抛出ValueError,无需手动判断月份天数、闰年等复杂逻辑
  3. 高效过滤:遇到空日期或无效日期的行直接跳过,不写入输出文件,一次遍历完成所有操作

对比原代码的优势

  • 原代码把全量数据存入列表,GB级CSV会直接导致内存不足;流式处理无此问题
  • 原代码需要两次遍历(清洗日期+过滤行),优化后仅需一次遍历,时间开销减半
  • 日期校验逻辑更严谨,不会出现手动判断漏判的情况(比如2月29日的闰年处理)

内容的提问来源于stack exchange,提问作者stroxx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 11:05:30