如何高效将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
相关产品推荐
相关产品推荐

