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

如何高效将DataFrame分片数据追加写入JSON文件?

高效追加DataFrame数据到JSON文件的方案

你的代码问题在于每次直接追加单个字典到文件,导致最终文件是多个独立字典的拼接(形如{...}{...}{...}),既不是合法的JSON格式,也缺乏可读性。以下是两种高效且规范的解决方案:

方案一:维护合法JSON数组(适合小数据量,需完整数组结构)

这种方式会将所有数据存储为一个标准的JSON数组,每次追加时先读取现有数据,合并后重新写入,保证格式合法且可读性强。

import json
import pandas as pd
from pathlib import Path

# 假设df为你的原始DataFrame
for i in [1, 2, 3]:
    file_path = Path(f'json_file_{i}.json')
    # 初始化现有数据列表
    existing_data = []
    
    # 读取已有文件数据(如果存在)
    if file_path.exists():
        with open(file_path, 'r', encoding='utf-8') as f:
            existing_data = json.load(f)
    
    # 遍历分片并合并数据
    for j in [1, 2, 3]:
        # 用loc替代query,性能更优
        df_part = df.loc[(df['A'] == i) & (df['B'] == j)]
        # 将分片转为字典列表(每条记录对应一个字典)
        new_records = df_part.to_dict('records')
        existing_data.extend(new_records)
    
    # 写入文件,indent参数保证格式化输出
    with open(file_path, 'w', encoding='utf-8') as f:
        json.dump(existing_data, f, indent=2, ensure_ascii=False)

优缺点:

  • 优点:生成标准JSON数组,可读性强,后续可直接用json.load解析
  • 缺点:大数据量下,读取整个数组会占用较多内存,效率较低

方案二:使用JSON Lines格式(适合大数据量,高效追加)

JSON Lines是一种轻量级格式,每行存储一个独立的JSON对象,追加时无需读取整个文件,直接在末尾写入新行即可,IO效率极高。

优化版代码(减少IO操作)

import json
import pandas as pd
from pathlib import Path

for i in [1, 2, 3]:
    file_path = Path(f'json_file_{i}.jsonl')  # 用jsonl后缀标识格式
    # 外层打开文件,避免循环内频繁IO
    with open(file_path, 'a', encoding='utf-8') as f:
        for j in [1, 2, 3]:
            df_part = df.loc[(df['A'] == i) & (df['B'] == j)]
            # 生成JSON Lines格式字符串,一次性写入
            json_lines = '\n'.join(
                json.dumps(record, ensure_ascii=False) 
                for record in df_part.to_dict('records')
            ) + '\n'
            f.write(json_lines)

读取JSON Lines文件:后续需要读取时,可直接用pandas支持的格式解析:

df = pd.read_json('json_file_1.jsonl', lines=True)

优缺点:

  • 优点:追加时无需读取全量数据,内存占用低,适合大数据场景
  • 缺点:文件本身不是单个JSON数组,需按行解析(但主流工具均支持)

额外优化建议

  • 用df.loc替代df.query:在大数据量下,loc的索引性能远高于query
  • 减少文件打开次数:尽量将文件操作放在外层循环,避免频繁打开/关闭文件带来的性能损耗

内容的提问来源于stack exchange,提问作者Joris Berendschot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 20:57:23