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
相关产品推荐
相关产品推荐

