Python对比两文件内容 将缺失独有项输出至第三文件方法
文件名差异提取实现方案
核心逻辑是将两个文件中的文件名列表读取为集合,通过集合差集运算直接得到仅在旧列表中存在、新列表缺失的文件名,可直接复用以下代码:
import os def read_file_list(file_path): # 兼容首次运行无历史文件的场景 if not os.path.exists(file_path): return set() with open(file_path, 'r', encoding='utf-8') as f: # 逐行读取,过滤空行、去掉每行首尾的换行/空格 return {line.strip() for line in f if line.strip()} # 读取本次、上次的文件列表 current_list = read_file_list('names.txt') last_list = read_file_list('names2.txt') # 计算缺失项:上次存在、本次不存在的文件 missing_files = last_list - current_list # 如需统计新增文件可追加计算:new_files = current_list - last_list # 写入缺失文件列表 with open('missing.txt', 'w', encoding='utf-8') as f: # 排序后写入,方便人工核对 for file_name in sorted(missing_files): f.write(f"{file_name}\n")
代码处理细节:
- 自动判断文件是否存在,首次运行没有历史
names2.txt时不会抛出异常 - 读取时自动过滤空行和无效空白字符,避免因为txt文件格式问题导致匹配错误
- 集合差集计算时间复杂度为O(n),即使文件列表达到上千条也能快速出结果
- 输出前对文件名排序,避免乱序增加核对成本
更优实现方案
JSON存储方案
纯txt存储文件名足够轻量,但扩展性很差,如果后续需要关联存储扫描时间、文件校验结果、文件哈希值等额外信息,JSON是更合适的选择,同时还能省掉手动转存旧txt文件的步骤:
- 程序启动时先读取历史扫描记录文件
scan_record.json,拿到上一次扫描的有效文件列表 - 扫描当前目录,过滤得到本次符合
_api.json后缀规则的文件列表 - 两个列表做差集,分别得到缺失文件、新增文件列表,写入差异结果
- 将本次扫描的时间、有效文件列表等信息写入
scan_record.json,覆盖旧记录即可
参考JSON存储格式:
{ "last_scan_time": "2024-05-20T14:30:00.123456", "valid_api_files": [ "user_api.json", "order_api.json", "pay_api.json" ] }
对应读写JSON的核心代码:
import json import os from datetime import datetime def load_last_record(): if not os.path.exists('scan_record.json'): return set() with open('scan_record.json', 'r', encoding='utf-8') as f: record = json.load(f) return set(record.get('valid_api_files', [])) def save_current_record(file_list): record = { "last_scan_time": datetime.now().isoformat(), "valid_api_files": list(file_list) } with open('scan_record.json', 'w', encoding='utf-8') as f: json.dump(record, f, ensure_ascii=False, indent=2)
其他优化建议
- 匹配
_api.json后缀文件时,建议使用filename.endswith("_api.json")做判断,避免误匹配文件名中包含_api.json但实际后缀不符合的文件 - 如果需要追溯历史变更,可以把每次扫描的增删结果追加存储到
change_history.json中,方便后续排查文件变动时间 - 不需要逐行遍历两个文件做比对,集合运算的性能远高于逐行字符串匹配,文件量越大优势越明显
内容的提问来源于stack exchange,提问作者Montek
相关产品推荐
相关产品推荐

