如何用Python循环加载并合并n个JSON文件?
合并多个JSON文件的通用实现及错误修复
问题原因分析
你的代码出现TypeError: str, bytes or os.PathLike object, not Tuple及逻辑问题,主要原因有这几点:
- 语法错误:
loadjson函数定义末尾缺少冒号,违反Python语法规则。 - 参数传递错误:循环中调用
loadjson(file)时,file是函数接收的所有文件路径组成的元组,而非当前循环的单个文件路径,导致open()函数接收到非字符串类型的参数,触发类型错误。 - 合并逻辑失效:
result = {**json_data}会每次用新加载的JSON数据完全覆盖之前的结果,没有实现合并效果。 - 调用缩进错误:
merge_JsonFiles(file1, file2, file3)被缩进在函数内部,永远不会被执行。
修正后的通用实现代码
import json def loadjson(file_path): # 加载单个JSON文件,返回字典格式数据 with open(file_path, 'r', encoding='utf-8') as fh: return json.load(fh) def merge_JsonFiles(*file_paths): merged_dict = {} for path in file_paths: json_data = loadjson(path) # 将当前JSON数据合并到结果字典,重复键会被新值覆盖 merged_dict.update(json_data) return merged_dict # 调用示例(替换为你的实际文件路径) if __name__ == "__main__": file1 = "data1.json" file2 = "data2.json" file3 = "data3.json" final_result = merge_JsonFiles(file1, file2, file3) print(final_result)
扩展:保留重复键的多值合并
如果需要保留相同键的所有值(比如把重复键的内容合并为列表),可以修改合并逻辑:
def merge_JsonFiles(*file_paths): merged_dict = {} for path in file_paths: json_data = loadjson(path) for key, value in json_data.items(): if key in merged_dict: # 若键已存在,将旧值转为列表并追加新值 if not isinstance(merged_dict[key], list): merged_dict[key] = [merged_dict[key]] merged_dict[key].append(value) else: merged_dict[key] = value return merged_dict
内容的提问来源于stack exchange,提问作者Bokambo
相关产品推荐
相关产品推荐

