如何使用Python基于Id合并两个每行为独立JSON对象的JSON文件
行式JSON文件按id合并实现方案
你使用
json.load()直接读取整个文件报错的原因是,这两个文件是JSON Lines格式,仅每行是独立的合法JSON对象,整体不符合标准JSON的格式要求,因此无法直接加载整个文件,需要逐行读取解析。
实现思路
- 先读取第一个文件,将每行解析为JSON对象后,以
id字段为键存入字典,方便后续快速匹配 - 再读取第二个文件,每行解析后按
id匹配字典中已有的对象,合并两个对象的字段 - 最后将合并后的结果输出为新文件,可按需选择行JSON或标准JSON格式
完整可运行代码
import json # 建立id到对象的映射字典 id_map = {} # 读取第一个文件 with open("File1.json", "r", encoding="utf-8") as f1: for line in f1: # 跳过空行 line = line.strip() if not line: continue obj = json.loads(line) id_map[obj["id"]] = obj # 读取第二个文件并合并内容 with open("File2.json", "r", encoding="utf-8") as f2: for line in f2: line = line.strip() if not line: continue obj = json.loads(line) obj_id = obj["id"] if obj_id in id_map: # 同名字段默认第二个文件覆盖第一个,不需要覆盖可调整update前后顺序 id_map[obj_id].update(obj) # 输出为和原格式一致的行JSON文件 with open("merged.json", "w", encoding="utf-8") as out_f: for merged_obj in id_map.values(): out_f.write(json.dumps(merged_obj, ensure_ascii=False) + "\n") # 如需输出标准JSON数组,使用下方代码即可 # with open("merged_standard.json", "w", encoding="utf-8") as out_f: # json.dump(list(id_map.values()), out_f, ensure_ascii=False, indent=2)
常见调整说明
- 字段覆盖规则:如果需要保留第一个文件的同名字段,将合并逻辑改为:
new_obj = obj new_obj.update(id_map[obj_id]) id_map[obj_id] = new_obj - 按id排序输出:如果需要输出结果按id从小到大排序,输出时改为遍历
sorted(id_map.values(), key=lambda x: x["id"])即可
内容的提问来源于stack exchange,提问作者Vinay
相关产品推荐
相关产品推荐

