使用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
相关产品推荐
相关产品推荐

