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

