Python:如何将JSON字典列表中指定键值对写入JSON文件
解决JSON写入仅保留最后一个字典的问题
我懂你遇到的这个坑!之前我也踩过——每次循环处理JSON字典列表,最后写入的文件只剩最后一条数据,核心问题通常出在这两个地方:
- 循环里用
open(..., 'w')打开文件:w模式会清空文件内容再写入,每次循环都会覆盖之前的结果,最后自然只剩最后一个字典。 - 没有把所有需要保存的键值对先整理成一个合法的JSON结构(比如列表),而是逐个写入单个字典,破坏了JSON的格式规范。
正确的解决思路
先把所有需要提取的键值对收集到一个列表(或其他合法JSON结构)里,再一次性写入到文件,而不是循环逐个写入。
修正后的代码示例
假设你要提取每个字典里的"specific_key"键值对,代码可以这么写:
import json from os.path import dirname, join # 1. 读取原JSON文件的字典列表 with open(join(dirname(__file__), 'text.json')) as tone_json: python_obj = json.load(tone_json) # 2. 遍历所有字典,收集目标键值对 output_data = [] for item in python_obj: # 提取单个特定键的键值对,组成新字典加入列表 if "specific_key" in item: # 先判断键是否存在,避免KeyError output_data.append({"specific_key": item["specific_key"]}) # 如果要提取多个键,可以用字典推导式: # target_keys = ["key1", "key2", "key3"] # output_data.append({k: item[k] for k in target_keys if k in item}) # 3. 一次性将整个列表写入新JSON文件 with open(join(dirname(__file__), 'output.json'), 'w') as out_file: json.dump(output_data, out_file, indent=4) # indent参数让JSON更易读
为什么这样能解决问题?
- 我们先把所有需要保存的内容整理成一个Python列表,这个列表对应JSON里的数组结构,是合法的JSON格式。
- 最后用
json.dump()一次性把整个列表写入文件,这样所有的键值对都会被序列化并保存,不会出现覆盖的情况。
关于“追加写入”的注意事项
如果你非要尝试追加模式(非常不推荐,因为会破坏JSON的结构完整性),你需要先读取已有文件的内容,把新元素加入后再重新写入——但这种方法容易出错,比如文件为空、格式损坏等情况,远不如先收集再整体写入可靠。
内容的提问来源于stack exchange,提问作者AWalton
相关产品推荐
相关产品推荐

