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

Python:创建空JSON文件并高效追加JSON格式数据的正确实现方法

解决JSON数组追加数据的问题

你的代码问题出在两个核心点上:一是每次循环都用'w'模式打开文件,这会直接清空原有内容再写入新数据,自然会覆盖之前的内容;二是你把字符串形式的JSON直接用json.dump()写入,最终文件里存的是JSON字符串,而不是数组里的对象元素。

下面给你两种高效的解决方案,按需选择:

方案一:读写整个数组(适合小数据量)

这种方法逻辑最简单,先读取文件里的现有数组(如果文件不存在就初始化空数组),把新元素加入后再整个写回文件:

import json

# 读取现有数据,文件不存在则初始化空数组
try:
    with open("test.json", mode='r', encoding='utf-8') as f:
        existing_data = json.load(f)
except FileNotFoundError:
    existing_data = []

# 准备要追加的数据(用Python字典,不是字符串)
new_items = [{"name":"alan","job":"clerk"}, {"name":"bob","job":"engineer"}]
existing_data.extend(new_items)

# 将更新后的数组写回文件,indent=2让JSON更易读,可选
with open("test.json", mode='w', encoding='utf-8') as f:
    json.dump(existing_data, f, indent=2)

方案二:逐行追加(适合大数据量)

如果要处理的数据集很大,不想把整个数组加载到内存里,可以用这种方式:先初始化文件为数组开头,然后逐个追加元素,最后补上数组闭合括号(注意处理元素间的逗号分隔):

import json
import os

# 初始化文件(仅第一次执行或文件不存在时执行)
if not os.path.exists("test.json"):
    with open("test.json", mode='w', encoding='utf-8') as f:
        f.write("[")

# 准备要追加的数据
new_items = [{"name":"alan","job":"clerk"}, {"name":"bob","job":"engineer"}]

# 追加元素到文件
with open("test.json", mode='r+', encoding='utf-8') as f:
    # 移动到文件末尾,检查最后一个字符是否是'['(判断是否是第一个元素)
    f.seek(0, os.SEEK_END)
    position = f.tell() - 1
    f.seek(position)
    last_char = f.read(1)
    
    with open("test.json", mode='a', encoding='utf-8') as append_f:
        for idx, item in enumerate(new_items):
            if last_char != '[':  # 不是第一个元素,先加逗号分隔
                append_f.write(",")
            json.dump(item, append_f)
            last_char = '}'  # 更新最后字符状态,避免重复判断
        # 最后确保文件以']'结尾
        f.seek(0, os.SEEK_END)
        if f.read(1) != ']':
            append_f.write("]")

这种方式不用加载整个数组,内存占用更低,但要注意文件的完整性——如果程序中途崩溃,文件可能会处于未闭合的状态,需要额外做异常处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 09:52:27