如何从多个存在细微差异的重复JSON文件中删除指定文本块
解决方案
优先使用JSON结构化解析实现,比正则匹配更稳定,不会因为文本缩进、换行、字段顺序变化导致匹配失效,同时天然适配FindMe字段URL不同的场景,直接通过Animal.Type_species的值判断是否需要删除即可。
Python 实现脚本
import json import os import shutil # -------------------------- 配置项 -------------------------- # 存放待处理JSON文件的文件夹路径 JSON_DIR = "./your_json_files" # 是否备份原文件(建议开启,防止误删) BACKUP_ORIGIN = True # 删除条件:满足该条件的块会被删除 def is_should_delete(item): # 只要Animal下的Type_species为Mammal就删除,无视FindMe字段内容 return item.get("Animal", {}).get("Type_species") == "Mammal" # ----------------------------------------------------------- def process_single_file(file_path): # 读取原文件 with open(file_path, "r", encoding="utf-8") as f: try: data = json.load(f) except json.JSONDecodeError as e: print(f"文件 {file_path} 格式错误,跳过处理:{e}") return # 过滤数据:仅保留不需要删除的块 if isinstance(data, list): filtered_data = [item for item in data if not is_should_delete(item)] else: # 如果你的JSON外层不是数组,可自行调整此处逻辑,例如如果外层是{"list": [xxx]}则写: # filtered_data = data # filtered_data["list"] = [item for item in data["list"] if not is_should_delete(item)] print(f"文件 {file_path} 顶层不是数组,跳过处理") return # 备份原文件 if BACKUP_ORIGIN: shutil.copy(file_path, f"{file_path}.bak") # 写入处理后的数据 with open(file_path, "w", encoding="utf-8") as f: json.dump(filtered_data, f, indent=2, ensure_ascii=False) print(f"处理完成:{file_path}") if __name__ == "__main__": for filename in os.listdir(JSON_DIR): if filename.endswith(".json"): full_path = os.path.join(JSON_DIR, filename) if os.path.isfile(full_path): process_single_file(full_path) print("所有文件处理完毕")
使用说明
- 把所有待处理的JSON文件放到同一个文件夹内
- 修改脚本中
JSON_DIR的配置为你的文件夹路径 - 确认删除条件:默认只要
Type_species等于Mammal就删除,符合你提出的两个需求,不管FindMe的URL是什么都会匹配 - 运行脚本即可,开启备份的情况下原文件会保留为
.bak后缀的文件,确认处理无误可自行删除备份
特殊场景适配
如果你的JSON文件存在语法问题无法正常解析,可以使用以下简化的文本处理脚本(仅适配你给出的固定格式场景):
import re import os JSON_DIR = "./your_json_files" BACKUP_ORIGIN = True # 匹配Mammal对应的块的正则 pattern = re.compile(r'\{\s*"Animal":\s*\{\s*"Type_species":\s*"Mammal"\s*},.*?},', re.DOTALL) for filename in os.listdir(JSON_DIR): if filename.endswith(".json"): full_path = os.path.join(JSON_DIR, filename) with open(full_path, "r", encoding="utf-8") as f: content = f.read() new_content = pattern.sub("", content) if BACKUP_ORIGIN: with open(f"{full_path}.bak", "w", encoding="utf-8") as f: f.write(content) with open(full_path, "w", encoding="utf-8") as f: f.write(new_content)
内容的提问来源于stack exchange,提问作者A. H.
相关产品推荐
相关产品推荐

