Python实现JSON文件不存在则创建、存在则追加写入的问题排查
问题原因
你的代码有两个核心错误:
- 用
a+模式打开文件时,文件指针默认停在文件末尾,直接调用json.load(f)读不到任何有效字符,自然会抛出Expecting value: line 1 column 1 (char 0)的解析错误。 - 就算你手动把指针移到文件开头读到了旧内容,
a+模式下写入的内容会直接拼接到文件末尾,不会删除旧的JSON结构,最后就会出现两个并列JSON数组的非法格式。
标准实现方案
存储单个合法JSON数组、实现追加元素的逻辑,不要用文件追加模式直接写,正确流程非常简单:
- 读取文件中已存储的合法JSON数组,如果文件不存在、为空或内容损坏,就初始化空数组
- 把新的数据项追加到数组中
- 用覆盖写入模式把完整的数组写回文件
可直接运行的代码如下:
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
相关产品推荐
相关产品推荐

