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

用Python json_lines转2G大JSON到CSV遇问题:代码运行无结果

问题分析与解决方案

你的代码之所以一直运行无输出,核心问题有两个:

  1. 内存过载:把2GB的JSON Lines文件全部加载到data列表里,内存根本扛不住,程序会卡在数据加载阶段,甚至直接崩溃。
  2. 未处理嵌套结构:你的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 05:48:12