如何在Python中对比JSON文件并向其中追加内容
合并JSON文件:将file2中file1没有的对象追加到file1
现有JSON文件
file1.json
[ { "name": "john", "version": "0.0" }, { "name": "peter", "version": "1.0" }, { "name": "bob", "version": "2.0", "single": "true" } ]
file2.json
[ { "name": "jane", "version": "0.0" }, { "name": "peter", "version": "1.0" }, { "name": "bob", "version": "2.0", "single": "true" } ]
需求说明
对比两个文件中的name字段,把file2里存在但file1里没有的name对应的JSON对象,追加到file1.json中。比如上面的例子里,jane不在file1里,所以要把对应的对象加进去,最终file1应该是:
[ { "name": "john", "version": "0.0" }, { "name": "peter", "version": "1.0" }, { "name": "bob", "version": "2.0", "single": "true" }, { "name": "jane", "version": "0.0" } ]
你写的代码(存在问题)
import json # 原代码漏了导入json模块 with open('file1.json', 'r') as file1, open('file2.json', 'r') as file2: file1_json = json.load(file1) file2_json = json.load(file2) for object in file2_json: if object['name'] not in file1_json.values(): file1_json.update(object) with open('file1.json', 'w') as file1: json.dump(file1_json, file1, indent=4)
代码问题点
file1_json是列表类型,不是字典,所以没有values()和update()方法,运行会直接报错- 就算要检查name是否存在,也不能直接用
file1_json.values(),得先提取所有file1里的name值
修正后的代码
import json with open('file1.json', 'r') as file1, open('file2.json', 'r') as file2: file1_data = json.load(file1) file2_data = json.load(file2) # 提取file1中所有已存在的name,用集合存,查找效率更高 existing_names = {item['name'] for item in file1_data} # 遍历file2的每个对象,检查name是否不在file1里 for item in file2_data: if item['name'] not in existing_names: file1_data.append(item) existing_names.add(item['name']) # 避免重复添加(如果file2里有重复name的话) # 写入更新后的内容到file1.json with open('file1.json', 'w') as file1: json.dump(file1_data, file1, indent=4)
说明
- 先把file1里的所有name放到集合
existing_names里,集合的成员查询速度比列表快很多,数据量大的时候更明显 - 遍历file2的每个对象,只要name不在集合里,就追加到file1的列表中,同时把这个name加入集合,防止file2里有重复name的对象被多次添加
- 最后用
json.dump写入时指定indent=4,保证输出的JSON格式和原来一致,可读性好
内容的提问来源于stack exchange,提问作者cttrader
相关产品推荐
相关产品推荐

