filecmp.dircmp用于快速比对目录结构,仅检查路径、大小和修改时间,需设shallow=False避免漏判;left_only/right_only表示真实增删文件,diff_files仅提示同名但可能内容不同,须配合filecmp.cmp(..., shallow=False)逐字节验证。

用 filecmp.dircmp 做基础结构比对
直接用标准库的 filecmp.dircmp 是最快上手的方式,它不读文件内容,只比对目录树结构和文件名、大小、修改时间——适合快速发现“漏拷贝”或“多出文件”这类问题。
常见错误是调用后没看 left_only、right_only 这些属性,以为返回值就是差异结果。实际必须显式访问:
-
d = filecmp.dircmp('path_a', 'path_b')创建对象后,d.left_only返回只在左目录存在的路径列表(相对路径) -
d.diff_files是同名但内容/时间不同的文件(注意:默认只按 size + mtime 判断,不是逐字节校验) - 如果子目录有差异,
d.subdirs里会包含嵌套的dircmp对象,需递归处理
要真正比内容?得用 filecmp.cmp() 或手动读取
filecmp.dircmp 默认不校验文件内容,只靠 size 和 mtime 判断是否相同。很多场景下这不够——比如文件被覆盖但 size 没变,或跨平台保存导致 mtime 不一致。
这时候得进一层:遍历 diff_files,对每个文件调用 filecmp.cmp(f1, f2, shallow=False)。关键点:
立即学习“Python免费学习笔记(深入)”;
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
-
shallow=False强制逐字节比对,避免误判 - 大文件慎用:该函数会一次性加载两份内容到内存,1GB 文件可能直接 OOM
- 更稳妥的做法是用
hashlib分块计算sha256,再比哈希值——内存可控,且支持断点续比
忽略特定文件或目录?靠 hide 和 ignore 参数
filecmp.dircmp 支持过滤,但参数名容易误解:hide 是隐藏匹配的条目(不参与比对),ignore 是跳过匹配的条目(也不参与)。两者都接受字符串列表,支持通配符但不支持正则。
典型用法:
-
filecmp.dircmp(a, b, ignore=['__pycache__', '.git', '*.log'])—— 忽略常见临时目录和日志 -
hide=['temp']如果你只想暂时屏蔽某个子目录,又不想改路径参数,就用这个 - 注意:两个参数都会影响
subdirs的生成,被忽略的子目录不会出现在d.subdirs里
输出差异时别只打印路径,带上类型标记
直接 print d.left_only 只给一串文件名,很难快速判断是文件还是目录。实际处理时建议加类型标注:
for p in d.left_only:
full_path = os.path.join(d.left, p)
if os.path.isdir(full_path):
print(f"[DIR] {p} only in left")
else:
print(f"[FILE] {p} only in left")
同样适用于 right_only、diff_files。另外,diff_files 里的路径是相对的,拼接时务必用 os.path.join(d.left, ...) 和 os.path.join(d.right, ...),别硬拼字符串——Windows 路径分隔符会出错。
真正麻烦的是符号链接、权限、扩展属性这些 filecmp 完全不碰的东西。如果业务需要比这些,就得换 os.stat() 手动比对,或者用 rsync --dry-run 借壳。

















