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

使用Python csv模块分块写入大CSV文件以避免内存错误

用csv模块分块流式处理大文件的解决方案

核心思路

不要将所有处理后的数据缓存到内存中再一次性写入,而是边读、边处理、边写入,或者分小批次处理后立即写入并释放内存,从根源上避免内存溢出。

方案1:逐行处理+逐行写入(最省内存)

直接用csv.reader逐行读取源文件,处理后立刻用csv.writer写入目标文件,全程只有当前行数据在内存中:

import csv

# 用with语句自动管理文件生命周期,无需手动关闭
with open('source_large.csv', 'r', newline='', encoding='utf-8') as src_file, \
     open('output_large.csv', 'w', newline='', encoding='utf-8') as dest_file:
    
    reader = csv.reader(src_file)
    writer = csv.writer(dest_file)
    
    # 跳过源文件表头(如果源文件有表头,且你已单独写入目标文件表头)
    next(reader)
    
    # 逐行处理并写入
    for row in reader:
        # 这里替换成你的实际数据处理逻辑
        processed_row = [row[0].strip(), str(int(row[1]) + 100), row[2].upper()]
        
        # 立即写入当前处理后的行
        writer.writerow(processed_row)

方案2:小批量处理+批量写入(适合需批量操作的场景)

如果你的处理逻辑依赖批量数据(比如批量统计、批量格式转换),可以设置一个批次大小,攒够指定行数处理后批量写入,写完清空临时列表释放内存:

import csv

BATCH_SIZE = 1000  # 可根据内存情况调整,比如2000、5000

with open('source_large.csv', 'r', newline='', encoding='utf-8') as src_file, \
     open('output_large.csv', 'w', newline='', encoding='utf-8') as dest_file:
    
    reader = csv.reader(src_file)
    writer = csv.writer(dest_file)
    
    next(reader)  # 跳过源文件表头
    batch_cache = []
    
    for row in reader:
        # 处理单条数据
        processed_row = [row[0].strip(), str(int(row[1]) + 100), row[2].upper()]
        batch_cache.append(processed_row)
        
        # 达到批次阈值就批量写入并清空缓存
        if len(batch_cache) >= BATCH_SIZE:
            writer.writerows(batch_cache)
            batch_cache.clear()
    
    # 写入最后一批不足BATCH_SIZE的数据
    if batch_cache:
        writer.writerows(batch_cache)

关键注意事项

  • 绝对不要用list(reader)将所有行加载到内存,这是触发内存错误的核心原因。
  • 打开文件时指定newline='':避免csv模块与系统换行规则冲突,生成多余空行。
  • 保持编码统一:源文件和目标文件使用相同编码(如utf-8),避免乱码问题。
  • 可选异常处理:如果处理过程中可能出现数据格式错误,可添加try-except块,避免程序崩溃丢失已写入数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 09:10:34