用Python json_lines转2G大JSON到CSV遇问题:代码运行无结果
问题分析与解决方案
你的代码之所以一直运行无输出,核心问题有两个:
- 内存过载:把2GB的JSON Lines文件全部加载到
data列表里,内存根本扛不住,程序会卡在数据加载阶段,甚至直接崩溃。 - 未处理嵌套结构:你的JSON里有
experience、education这类数组/嵌套对象,直接用row.values()写入CSV会得到一堆无法解析的字符串。
改进后的代码
下面的代码解决了内存问题,同时处理了嵌套字段,适合大文件转换:
import json_lines import csv def flatten_json(obj, prefix=''): """扁平化嵌套JSON对象,处理数组和字典""" result = {} for key, value in obj.items(): new_key = f"{prefix}{key}" if prefix else key if isinstance(value, dict): # 递归展开嵌套字典 result.update(flatten_json(value, new_key + '_')) elif isinstance(value, list): # 数组转逗号分隔字符串,也可根据需求改为JSON序列化 result[new_key] = ','.join(str(i) for i in value) if value else None else: result[new_key] = value return result # 第一步:获取所有可能的字段(确保表头覆盖所有数据) all_fields = set() with open('xaa', 'rb') as f: for item in json_lines.reader(f): flattened = flatten_json(item) all_fields.update(flattened.keys()) break # 仅读取第一个样本,若数据字段不一致可多读取几个 # 第二步:边读边写CSV,不占用大量内存 with open('data.csv', 'w', encoding='utf-8', newline='') as csv_out: writer = csv.DictWriter(csv_out, fieldnames=sorted(all_fields)) writer.writeheader() with open('xaa', 'rb') as json_in: for idx, item in enumerate(json_lines.reader(json_in)): # 每处理1000条打印进度,方便观察运行状态 if idx % 1000 == 0: print(f"已处理 {idx} 条数据") writer.writerow(flatten_json(item))
关键改进点
- 内存优化:不再一次性加载所有数据,而是读取一条处理一条、写入一条,内存占用始终保持在低水平。
- 嵌套处理:通过
flatten_json函数把嵌套对象展开为带前缀的字段(比如experience_0_company_name),数组转为逗号分隔的字符串,确保CSV内容可读可用。 - 字段完整性:用
csv.DictWriter保证所有字段都被写入,即使部分数据缺少某些字段,也会在对应列留空。 - 进度反馈:添加了进度打印,避免你以为程序没反应。
如果你确认所有数据的字段结构完全一致,可以跳过第一步的字段收集,直接用第一个数据的字段作为表头,进一步提高效率。
内容的提问来源于stack exchange,提问作者salaheddine Rmaili
相关产品推荐
相关产品推荐

