filecmp.cmp() 默认 shallow=True 仅比大小和修改时间,需设 shallow=False 才逐字节比对内容;路径须存在且建议用绝对路径;大文件分块读取不爆内存,但换行符或编码差异会影响结果。

filecmp.cmp() 是最直接的文件内容比对函数
它默认先比较文件大小和修改时间,快速排除明显不同的情况;若这两项一致,再逐字节读取比对内容。这种“短路判断”机制让大多数场景下比手动读文件快得多。
- 默认参数
shallow=True依赖系统 stat 信息,速度快但有风险:硬链接或不同 inode 的相同内容文件可能被误判为不等 - 必须设为
shallow=False才能确保纯内容比对,尤其在 Docker 容器、NAS 或符号链接频繁的环境中 - 返回
True表示内容完全一致(包括换行符、BOM、末尾空格等),False表示任一差异即否定
二进制文件和文本文件无需区分处理
filecmp.cmp() 底层按字节流读取,不解析编码,所以对图片、PDF、pyc、zip 等二进制文件天然安全。文本文件也不会因换行符(\r\n vs \n)或编码(UTF-8 with BOM vs without)产生误判——只要字节序列相同就返回 True。
- 不要自己用
open(..., 'r', encoding='utf-8').read()比较,会因编码错误中断,且忽略不可见控制字符 - 也不要用
hashlib.md5()先算哈希再比——小文件尚可,大文件多一次完整读取,徒增 I/O 和内存开销 - 如果真要哈希校验(比如跨机器比对),优先用
filecmp.cmp(f1, f2, shallow=False)快速兜底,失败后再按需计算哈希
OSError: [Errno 2] No such file or directory 是常见报错
这个错误不是比对逻辑问题,而是路径没找对。注意 filecmp.cmp() 不做路径存在性预检,遇到缺失文件直接抛异常,而不是静默返回 False。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 调用前务必用
os.path.exists()或pathlib.Path().exists()检查两个路径 - 相对路径容易出错,建议统一转为绝对路径:
os.path.abspath(path) - 权限不足(如只读挂载点)也会触发 OSError,此时需捕获并区分
errno.EACCES和errno.ENOENT
大文件比对时要注意内存和性能边界
filecmp.cmp() 内部使用固定缓冲区(通常 8KB)分块读取,不加载全文到内存,因此即使对比几个 GB 的文件也不会爆内存。但极端情况仍有隐患:
- SSD 或 NFS 上连续小文件批量比对时,I/O 密集可能拖慢整体速度——可加
time.sleep(0.001)避免饿死其他进程 - 同一文件被其他进程写入中,可能导致读取不一致;生产环境建议加文件锁或确认文件已关闭
- 若需统计差异位置(比如调试配置文件),
filecmp.cmp()无能为力,得换diff命令或ndiff
实际用起来就是三行:
import filecmp
same = filecmp.cmp('a.log', 'b.log', shallow=False)
print(same) # True or False
真正容易漏掉的是 shallow=False 和路径存在性检查——这两个点没处理好,结果看似正确,实则不可靠。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










