用Python合并多个JSON文件时遇JSONDecodeError,如何处理冗余记录完成合并
报错原因定位
- 你当前的待合并文件是JSON Lines 逐行存储格式:每个文件内每一行是独立的完整JSON对象,整个文件本身不是单份合法的JSON文档(没有把所有条目包裹在数组结构中)。
- Python标准库的
json.load()仅支持解析“整个文件内容为一个完整JSON值”的场景。当它解析完文件第一行的JSON对象后,检测到后续第二行仍存在未解析的内容,就会抛出JSONDecodeError: Extra data错误。 - 原代码使用
rb/wb二进制模式读写文本类JSON文件,在Python3环境下容易引入编码兼容问题。
修正后可直接运行的代码
import json import glob # 用集合存储记录实现自动去重 unique_records = set() for f in glob.glob("*.json"): # 跳过最终生成的合并文件,避免循环读取造成内容重复 if f == "merged_file.json": continue with open(f, "r", encoding="utf-8") as infile: for line in infile: # 跳过空行 line = line.strip() if not line: continue # 逐行解析单条JSON记录 record = json.loads(line) # 将字典转成可哈希的有序元组存入集合,自动过滤重复内容 record_key = tuple(sorted(record.items())) unique_records.add(record_key) # 将元组格式的记录转回字典结构 merge_result = [dict(item) for item in unique_records] # 写入合并后的文件 with open("merged_file.json", "w", encoding="utf-8") as outfile: json.dump(merge_result, outfile, ensure_ascii=False, indent=2)
方案效果说明
- 彻底解决
Extra data解码报错:采用逐行读取、逐行解析的逻辑,适配逐行存储的JSON文件结构 - 满足去重需求:你提供的两个文件共4条重复记录,合并去重后最终仅保留2条不重复的记录,无冗余内容
- 自动排除目标文件:避免脚本运行时将自己生成的
merged_file.json再次纳入读取范围,造成内容无限叠加 - 输出的合并JSON文件做了格式化缩进,打开后可读性更强
内容的提问来源于stack exchange,提问作者arr
相关产品推荐
相关产品推荐

