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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 09:54:00