Python无需全量加载JSON文件为字典列表追加元素的实现方案
大规模字典列表的追加写入方案
标准JSON格式的低内存追加方案
标准JSON的根数组默认以]闭合,本身没有设计增量追加的语法,但可以通过操作文件指针的方式实现不加载全量内容的追加,不需要读取整个列表到内存:
- 实现逻辑:定位到JSON文件末尾的
]字符位置,删除末尾的],写入逗号 + 序列化后的新字典,再补回]即可 - 代码实现:
import json import os def append_to_json_array(file_path: str, new_dict: dict) -> None: # 处理空文件场景 if not os.path.exists(file_path) or os.path.getsize(file_path) == 0: with open(file_path, "w", encoding="utf-8") as f: json.dump([new_dict], f, ensure_ascii=False) return with open(file_path, "r+", encoding="utf-8") as f: # 定位到文件末尾倒数1位 f.seek(-1, os.SEEK_END) # 校验文件是标准根数组格式 if f.read(1) != "]": raise ValueError("目标文件不是根节点为数组的标准JSON格式") # 回到]的位置覆盖写入 f.seek(-1, os.SEEK_END) # 写入逗号、新字典、闭合符号 f.write(",") json.dump(new_dict, f, ensure_ascii=False) f.write("]")
注意:该方案仅适用于JSON文件末尾无多余空白、注释、换行的纯净场景,操作中途如果程序崩溃会导致整个JSON文件格式损坏,重要生产数据不推荐使用
更适合大规模数据的替代存储格式
如果需要稳定、低风险支持千万级字典列表的追加,推荐使用**JSON Lines(JSONL/行式JSON)**格式,这是专门面向序列型JSON数据设计的存储规范:
- 格式规则:每一行存储一个独立的JSON字典,不需要外层数组包裹
- 核心优势:
- 追加操作零风险:直接往文件末尾写入新的JSON行即可,完全不需要修改原有内容
- 读取内存占用极低:可以逐行遍历读取,千万级数据也不需要加载全量到内存
- 兼容性好:Pandas、Spark等绝大多数大数据处理工具原生支持JSONL格式读取
- 代码实现:
import json # 追加新字典到JSONL文件 def append_to_jsonl(file_path: str, new_dict: dict) -> None: with open(file_path, "a", encoding="utf-8") as f: f.write(json.dumps(new_dict, ensure_ascii=False) + "\n") # 逐行读取JSONL文件,返回迭代器 def read_jsonl(file_path: str) -> iter: with open(file_path, "r", encoding="utf-8") as f: for line in f: line = line.strip() if not line: continue yield json.loads(line)
如果你的字典是固定结构的扁平数据,也可以选择CSV格式,追加逻辑和JSONL一致,但是对嵌套结构、特殊字符的支持不如JSONL。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

