Python遍历数组删除存在文件及多文件差异脚本技术咨询
问题解答:文件删除脚本实现 + 差异计算脚本常见疑问
一、遍历数组删除存在的文件实现
给你写了一个安全且易维护的实现,包含异常处理,避免因权限、文件占用等问题导致脚本崩溃:
import os def delete_existing_files(file_paths): for file_path in file_paths: # 先确认文件存在再执行删除 if os.path.exists(file_path): try: os.remove(file_path) print(f"✅ 成功删除文件: {file_path}") except PermissionError: print(f"❌ 权限不足,无法删除文件: {file_path}") except Exception as e: print(f"❌ 删除文件 {file_path} 时出错: {str(e)}") else: print(f"ℹ️ 文件不存在,跳过: {file_path}") # 示例调用 target_files = ["temp.log", "./data/old_config.json", "/var/tmp/cache.dat"] delete_existing_files(target_files)
关键细节说明:
- 用
os.path.exists()提前判断文件状态,避免删除不存在的文件触发报错 - 加入
try-except捕获常见异常,保证脚本遇到单个文件问题时能继续处理其他文件 - 打印状态日志,方便你快速追踪每个文件的处理结果
二、关于clientId差异计算脚本的常见问题解答
先把你提供的脚本补全(假设核心是对比四个文件中同一clientId的内容差异),再针对常见疑问逐一解答:
补全后的完整脚本(含基础差异计算逻辑)
#!/usr/bin/python import os, sys, re, json def calculate_client_diffs(old_pr, new_pr, old_snd, new_snd): # 获取所有出现过的clientId,避免遗漏 all_client_ids = set(old_pr.keys()).union(new_pr.keys()).union(old_snd.keys()).union(new_snd.keys()) diff_results = {} for client_id in all_client_ids: # 提取四个文件中该clientId的对应内容 old_pr_val = old_pr.get(client_id, None) new_pr_val = new_pr.get(client_id, None) old_snd_val = old_snd.get(client_id, None) new_snd_val = new_snd.get(client_id, None) # 计算多维度差异:新旧primary变化、新旧secondary变化、跨文件差异 diffs = { "primary_has_change": old_pr_val != new_pr_val, "secondary_has_change": old_snd_val != new_snd_val, "old_pr_vs_snd": old_pr_val != old_snd_val, "new_pr_vs_snd": new_pr_val != new_snd_val } diff_results[client_id] = diffs return diff_results if __name__ == "__main__": # 校验参数数量,避免用户传错 if len(sys.argv) != 5: print("用法:python script.py <old_primary> <new_primary> <old_second> <new_second>") sys.exit(1) try: with open(sys.argv[1]) as old_primary, open(sys.argv[2]) as new_primary, \ open(sys.argv[3]) as old_second, open(sys.argv[4]) as new_second: # 转换非标准JSON(数字键不带引号)为标准格式 prepare_json = lambda f: json.loads(re.sub(r'([0-9]+)=', '"\1":', f.read())) old_pr_data = prepare_json(old_primary) new_pr_data = prepare_json(new_primary) old_snd_data = prepare_json(old_second) new_snd_data = prepare_json(new_second) # 计算并输出差异结果 client_diffs = calculate_client_diffs(old_pr_data, new_pr_data, old_snd_data, new_snd_data) print(json.dumps(client_diffs, indent=2)) except FileNotFoundError as e: print(f"错误:找不到文件 {e.filename}") sys.exit(1) except json.JSONDecodeError: print("错误:文件转换后仍不是有效的JSON格式,请检查输入文件") sys.exit(1)
常见疑问解答
为什么要写那个正则替换
([0-9]+)=为"\1":?
因为你的输入文件不是标准JSON——标准JSON要求对象的键必须是双引号包裹的字符串,但你的文件用了数字=的格式(比如123={"name": "Alice"})。这个正则就是把这种非标准格式转换成标准JSON,让json.loads()能正常解析。如何避免用户传错文件参数?
可以像补全的脚本那样,在开头检查sys.argv的长度是否为5(脚本名+4个目标文件),如果不符合就打印用法并退出,避免后续流程因参数缺失报错。大文件处理时内存占用太高怎么办?
目前脚本是把整个文件读入内存后处理,如果文件特别大(比如几十上百MB),可以改成逐行解析(如果文件是每行一个client条目),或者用ijson这类流式JSON解析库,减少内存占用。想看到具体哪些字段不同,而不只是判断是否相等,怎么改?
可以写一个递归对比字典的函数,比如:def deep_diff(a, b): if a == b: return {} if type(a) != type(b): return {"type_diff": f"{type(a).__name__} vs {type(b).__name__}"} if isinstance(a, dict): diffs = {} all_keys = set(a.keys()).union(b.keys()) for key in all_keys: sub_diff = deep_diff(a.get(key), b.get(key)) if sub_diff: diffs[key] = sub_diff return diffs return {"value_diff": f"{a} vs {b}"}然后把差异计算部分改成调用这个函数,就能得到具体的字段差异细节了。
如何让脚本更健壮,处理文件读取或解析异常?
补全的脚本里已经加了FileNotFoundError和JSONDecodeError的捕获,能友好提示用户问题所在。你还可以根据需要添加更多异常捕获,比如PermissionError(文件无法读取)等。
内容的提问来源于stack exchange,提问作者user1950349
相关产品推荐
相关产品推荐

