我的知识记录

Python对比两个文件夹差异:一键找出新增删除修改文件

用Python对比两个文件夹的文件清单和修改时间,输出哪些文件新增、删除、修改,适合备份校验和版本对比。

场景痛点

备份完一个目录后,想知道哪些文件和源目录不一样;或者两个版本的项目文件夹,想快速定位改动过的文件。手动逐个打开文件夹对比,眼睛看花也数不清。用Python脚本遍历两边目录,按相对路径对齐,自动输出新增、删除、修改三类差异。

用到的库

pathlib   # 标准库,路径遍历
os        # 标准库,取文件元数据

完整代码

from pathlib import Path


def scan_dir(dir_path: str) -> dict:
"""
扫描目录,返回 {相对路径: (大小, 修改时间戳)} 字典
"""
root = Path(dir_path).resolve()
result = {}
for file in root.rglob('*'):
if not file.is_file():
continue
rel = file.relative_to(root)
stat = file.stat()
result[str(rel)] = (stat.st_size, stat.st_mtime)
return result


def compare_dirs(dir_a: str, dir_b: str) -> dict:
"""
对比两个目录的差异
:return: {'added': [], 'deleted': [], 'modified': [], 'same': int}
"""
files_a = scan_dir(dir_a)
files_b = scan_dir(dir_b)

set_a = set(files_a.keys())
set_b = set(files_b.keys())

only_in_a = sorted(set_a - set_b)   # 在A有B没有 -> A新增
only_in_b = sorted(set_b - set_a)   # 在B有A没有 -> B新增/删除
common = set_a & set_b

modified = []
same_count = 0
for rel in common:
size_a, mtime_a = files_a[rel]
size_b, mtime_b = files_b[rel]
if size_a != size_b or abs(mtime_a - mtime_b) > 1:
modified.append(rel)
else:
same_count += 1

report = {
"added_in_b": only_in_b,       # B有A没有
"deleted_in_b": only_in_a,     # A有B没有
"modified": sorted(modified),
"same": same_count
}

print(f"对比结果:")
print(f"  相同文件: {same_count}")
print(f"  B新增: {len(only_in_b)} 个")
for f in only_in_b:
print(f"    + {f}")
print(f"  B缺失: {len(only_in_a)} 个")
for f in only_in_a:
print(f"    - {f}")
print(f"  内容不同: {len(modified)} 个")
for f in modified:
print(f"    * {f}")

return report


if __name__ == "__main__":
compare_dirs("./workspace", "/backup/workspace")

代码讲解

  • scan_dir:遍历目录,用相对路径做key,文件大小和修改时间做value,存成字典。这样两边对齐时只需要按key做集合运算。
  • set_a - set_b:在A里但不在B里的文件,说明B缺失了。set_b - set_a则是B新增的。
  • 对比公共文件时,大小不同直接判定修改;大小相同但修改时间差超过1秒,也判定为修改。1秒的容差是为了跨文件系统时间精度差异。
  • 输出分四类:相同、B新增、B缺失、内容不同。一眼看清两个目录的差异全貌。

运行结果

脚本运行后在终端打印差异报告,类似:

对比结果:
相同文件: 120
B新增: 2 个
+ 新报表.xlsx
+ 子目录/说明.txt
B缺失: 1 个
- 旧合同.docx
内容不同: 3 个
* 日报.xlsx

注意事项

  • 这个对比只看大小和修改时间,不读文件内容。如果文件被编辑后又存回同样大小和时间,会误判为相同。需要严格比对可以改用MD5哈希。
  • 时间戳对比跨Windows和Linux时,注意时区差异。脚本用的是UTC时间戳,不受时区影响。
  • 目录里如果有正在写入的临时文件,对比结果会不稳定,建议先暂停写入再对比。

Python对比两个文件夹差异:一键找出新增删除修改文件

标签:

更新时间:2026-09-14 21:23:53

上一篇:Python对比两个文本文件差异:difflib生成清晰对比结果

下一篇:Python清理临时文件过期文件:按天数自动删除旧文件