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

Python实现JSON文件不存在则创建、存在则追加写入的问题排查

问题原因

你的代码有两个核心错误:

  • 用a+模式打开文件时,文件指针默认停在文件末尾,直接调用json.load(f)读不到任何有效字符,自然会抛出Expecting value: line 1 column 1 (char 0)的解析错误。
  • 就算你手动把指针移到文件开头读到了旧内容,a+模式下写入的内容会直接拼接到文件末尾,不会删除旧的JSON结构,最后就会出现两个并列JSON数组的非法格式。
标准实现方案

存储单个合法JSON数组、实现追加元素的逻辑,不要用文件追加模式直接写,正确流程非常简单:

  1. 读取文件中已存储的合法JSON数组,如果文件不存在、为空或内容损坏,就初始化空数组
  2. 把新的数据项追加到数组中
  3. 用覆盖写入模式把完整的数组写回文件

可直接运行的代码如下:

import json
import time
import os

data = {'key1': 1, 'key2': {'k2a': 2.1, 'k2b': 2.2}}
fname = 'test.json'

# 读取已有数据
record_list = []
if os.path.exists(fname):
    try:
        with open(fname, 'r', encoding='utf-8') as f:
            record_list = json.load(f)
    except (json.JSONDecodeError, IOError):
        # 捕获空文件、损坏文件的异常,重置为空列表即可
        record_list = []

# 追加新数据
record_list.append({'appended': time.time(), **data})

# 覆盖写回文件
with open(fname, 'w', encoding='utf-8') as f:
    json.dump(record_list, f, ensure_ascii=False, indent=2)

这个方案覆盖了所有边界场景:

  • 文件不存在时会自动创建,写入初始数据
  • 文件存在但内容为空、格式损坏时不会崩溃,会自动重置为合法结构
  • 每次写回都是完整的合法JSON格式,不会出现拼接错误
大数据量场景优化方案

如果你的数据量很大、写入频率很高,每次全量读写文件性能太差,就不要用单个JSON数组存储,改用JSON Lines格式(每行存储一个独立的JSON对象),这时候才适合用追加模式写入:

# 追加写入单行JSON
with open(fname, 'a', encoding='utf-8') as f:
    f.write(json.dumps({'appended': time.time(), **data}, ensure_ascii=False) + '\n')

读取的时候逐行解析每个JSON对象即可,不需要加载整个文件,是流式数据、日志类存储的通用方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 19:57:31