Python按修改日期范围筛选文件并使用difflib比对的问题求助
问题分析与解决方案
我看到你在筛选特定时间范围的文件并使用difflib对比时遇到了问题,咱们一步步梳理问题所在并解决它:
核心问题点
你的代码里有两个关键错误,导致筛选逻辑完全偏离预期:
- 时间差计算错误:你写的
max_days_ago = d.datetime.now() - d.timedelta(days=13 <= 15)中,13 <= 15是布尔判断,结果为True,而Python会把True当作整数1处理,所以这行实际是创建了一个1天的时间差,完全不符合你要的13-15天范围。 - 时间范围判断逻辑缺失:你只判断了
filetime < max_days_ago,没有限定下限(比如文件修改时间要晚于15天前),导致所有早于该错误时间点的文件都会被覆盖,最后只剩最旧的那个。
修正后的代码
下面是调整后的完整代码,我添加了注释和边界检查,确保逻辑符合你的需求:
import os, glob, sys, difflib, datetime as d p_path = 'C:/test/Text_file_compare_test/' f_list = glob.glob(os.path.join(p_path, '*.txt')) file1 = '' file2 = '' # 先统一获取当前时间,避免循环中多次调用导致的时间偏差 now = d.datetime.now() # 定义目标时间边界: # file1范围:修改时间在【15天前 ↔ 13天前】之间 days_15_ago = now - d.timedelta(days=15) days_13_ago = now - d.timedelta(days=13) # file2范围:修改时间在【1天前 ↔ 现在】之间 days_1_ago = now - d.timedelta(days=1) for file in f_list: # 获取文件的本地修改时间(Windows下无需额外时区转换) file_mtime = d.datetime.fromtimestamp(os.path.getmtime(file)) # 匹配13-15天前的文件 if days_15_ago <= file_mtime <= days_13_ago: file1 = file print(f"找到符合条件的file1: {os.path.basename(file)}") # 匹配1天以内的文件 if days_1_ago <= file_mtime <= now: file2 = file print(f"找到符合条件的file2: {os.path.basename(file)}") # 检查是否成功找到两个目标文件,避免后续报错 if not file1 or not file2: print("❌ 错误:未找到符合条件的file1或file2!") sys.exit(1) # 使用difflib对比文件内容 with open(file1, 'r', encoding='utf-8') as f1, open(file2, 'r', encoding='utf-8') as f2: differ = difflib.Differ() diff_result = list(differ.compare(f1.readlines(), f2.readlines())) sys.stdout.writelines(diff_result)
关键修改说明
- 清晰的时间边界:拆分出
days_15_ago、days_13_ago和days_1_ago,明确划分你需要的时间区间,确保只选中目标文件(比如你的green.txt会被选为file1,blue.txt选为file2)。 - 严谨的范围判断:使用
<=双向限定时间范围,避免误选不符合要求的文件。 - 错误检查:添加了文件存在性检查,防止因找不到目标文件导致后续代码崩溃。
- 编码指定:打开文件时指定
encoding='utf-8',避免Windows下可能出现的中文乱码问题。
额外提示
如果你的测试文件夹中存在多个符合条件的文件,当前代码会保留最后一个遍历到的文件。如果需要处理多文件场景,可以把file1、file2改成列表存储,再通过循环逐一对比。
内容的提问来源于stack exchange,提问作者Hellyeah
相关产品推荐
相关产品推荐

