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

Python 2.7大CSV转JSON:解决大文件内存溢出问题

解决Python 2.7大CSV转JSON内存溢出的分块处理方案

嘿,这个问题我太熟了!之前帮朋友处理过几GB的CSV转JSON,也是踩过内存溢出的坑——你之前的代码应该是一次性把整个4.5GB的CSV读进内存了(比如用list(csv.reader(...))这种操作),小文件能扛住,大文件直接把内存撑爆。下面给你一套分块读写的解决方案,保证内存友好还能输出合法的JSON。

核心思路

分块处理的关键是逐块读取CSV内容,逐块写入JSON文件,同时要保证最终的JSON是合法的数组格式——不能直接随便追加JSON对象,得处理好数组的开头、块之间的分隔符和结尾。

具体代码实现

import csv
import json
import codecs

def csv_to_json_large_file(csv_file_path, json_file_path, chunk_size=1000):
    # Python2.7用codecs处理编码,避免中文/特殊字符乱码
    with codecs.open(csv_file_path, 'r', 'utf-8') as csv_file:
        reader = csv.DictReader(csv_file)
        # 先打开JSON文件,写入数组的起始符号
        with codecs.open(json_file_path, 'w', 'utf-8') as json_file:
            json_file.write('[')
            first_chunk = True
            
            while True:
                # 每次读取chunk_size行数据,攒成一个块
                chunk = []
                for _ in range(chunk_size):
                    try:
                        row = next(reader)
                        chunk.append(row)
                    except StopIteration:
                        break  # 读完所有数据,跳出循环
                
                if not chunk:
                    break  # 没有数据了,结束处理
                
                # 处理块之间的分隔符:第一块前面不加逗号,后面的块必须加
                if not first_chunk:
                    json_file.write(',')
                else:
                    first_chunk = False
                
                # 将当前块转成JSON字符串写入文件
                json.dump(chunk, json_file)
            
            # 写入数组的结束符号,保证JSON格式合法
            json_file.write(']')

# 使用示例:你可以根据内存情况调整chunk_size,比如2000、5000都可以
csv_to_json_large_file('your_large.csv', 'output.json', chunk_size=2000)

代码细节说明

  • 分块读取逻辑:用next(reader)逐行读取,每次攒够chunk_size行就处理一次,内存里永远只保留一小部分数据,完全不会出现溢出问题。
  • JSON格式兼容:先写[开头,每块数据之间用逗号分隔,最后写]结尾,保证最终输出的是一个合法的JSON数组,直接就能被其他工具解析。
  • 编码处理:Python2.7对中文和特殊字符的编码支持不太友好,用codecs.open指定UTF-8编码能避免乱码问题。
  • 灵活调整:chunk_size可以根据你的机器内存情况调整,内存大就设大一点,内存小就设小一点,不影响最终结果。

额外备选方案:JSON Lines格式

如果你不需要把所有数据放在一个JSON数组里,而是想每行对应一个JSON对象(这种格式叫JSON Lines,很多大数据工具都支持),那代码会更简单,内存占用也更低:

def csv_to_json_lines(csv_file_path, json_lines_path):
    with codecs.open(csv_file_path, 'r', 'utf-8') as csv_file:
        reader = csv.DictReader(csv_file)
        with codecs.open(json_lines_path, 'w', 'utf-8') as json_file:
            for row in reader:
                json.dump(row, json_file)
                json_file.write('\n')

这种格式的好处是写入和读取都更高效,不需要处理数组的首尾和分隔符,后续如果要按行处理数据也更方便。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:29:18