You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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文件的步骤:

  1. 程序启动时先读取历史扫描记录文件scan_record.json,拿到上一次扫描的有效文件列表
  2. 扫描当前目录,过滤得到本次符合_api.json后缀规则的文件列表
  3. 两个列表做差集,分别得到缺失文件、新增文件列表,写入差异结果
  4. 将本次扫描的时间、有效文件列表等信息写入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 02:39:31