filecmp
--- 文件和目录的比较¶
源代码: Lib/filecmp.py
filecmp
模块定义了用于比较文件和目录的函数,这些函数支持多种可选的时间/正确性权衡。要比较文件,另请参阅 difflib
模块。
filecmp
模块定义了以下函数:
- filecmp.cmp(f1, f2, shallow=True)¶
比较名为 f1 和 f2 的文件,如果它们看起来相同则返回
True
,否则返回False
。如果 shallow 为真值且两个文件的
os.stat()
签名信息(文件类型、大小和修改时间)都相同,则文件被视为相等。否则,如果文件的大小或内容不同,则它们被视为不相同。
请注意,此函数不会调用外部程序,因此具有可移植性和高效率。
此函数会为过去的比较及其结果使用缓存,如果文件的
os.stat()
信息发生改变,则缓存条目会失效。整个缓存可使用clear_cache()
来清除。
- filecmp.cmpfiles(dir1, dir2, common, shallow=True)¶
比较 dir1 和 dir2 这两个目录中由 common 指定的文件。
返回三个文件名列表:match、mismatch、errors。match 包含匹配的文件列表,mismatch 包含不匹配的文件名,errors 列出无法比较的文件名。如果文件在其中一个目录中不存在、用户缺少读取权限或由于其他原因无法进行比较,则文件会被列在 errors 中。
shallow 形参的含义和默认值与
filecmp.cmp()
的相同。例如,
cmpfiles('a', 'b', ['c', 'd/e'])
将会比较a/c
和b/c
以及a/d/e
和b/d/e
。'c'
和'd/e'
将分别被放入返回的三个列表中的某一个。
- filecmp.clear_cache()¶
清除 filecmp 缓存。如果一个文件在被修改后很快就被比较,快到处于底层文件系统的 mtime 解析精度之内,那么这个函数会很有用。
在 3.4 版本加入。
dircmp
类¶
- class filecmp.dircmp(a, b, ignore=None, hide=None, *, shallow=True)¶
构建一个新的目录比较对象,用于比较目录 a 和 b。ignore 是要忽略的名称列表,默认为
filecmp.DEFAULT_IGNORES
。hide 是要隐藏的名称列表,默认为[os.curdir, os.pardir]
。dircmp
类默认通过使用 shallow 形参进行filecmp.cmp()
中描述的*浅*比较来比较文件。在 3.13 版本发生变更: 添加了 shallow 形参。
dircmp
类提供了以下方法:- report()¶
打印(到
sys.stdout
)a 和 b 之间的比较结果。
- report_partial_closure()¶
打印 a 和 b 以及共同的直接子目录之间的比较结果。
- report_full_closure()¶
打印 a 和 b 以及共同的子目录(递归地)之间的比较结果。
dircmp
类提供了许多有趣的属性,可用于获取有关正在比较的目录树的各种信息。请注意,通过
__getattr__()
钩子,所有属性都是延迟计算的,因此如果只使用那些计算开销小的属性,则不会有速度损失。- left¶
目录 a。
- right¶
目录 b。
- left_list¶
a 中的文件和子目录,经过 hide 和 ignore 过滤。
- right_list¶
b 中的文件和子目录,经过 hide 和 ignore 过滤。
- common¶
同时存在于 a 和 b 中的文件和子目录。
- left_only¶
只在 a 中存在的文件和子目录。
- right_only¶
只在 b 中存在的文件和子目录。
- common_dirs¶
同时存在于 a 和 b 中的子目录。
- common_files¶
同时存在于 a 和 b 中的文件。
- same_files¶
使用类的文件比较运算符,在 a 和 b 中都相同的文件。
- diff_files¶
同时存在于 a 和 b 中,但根据类的文件比较运算符,内容不同的文件。
- funny_files¶
同时存在于 a 和 b 中,但无法比较的文件。
- subdirs¶
一个字典,将
common_dirs
中的名称映射到dircmp
实例(如果此实例是 MyDirCmp 类型,即dircmp
的子类,则映射到 MyDirCmp 实例)。
这是一个使用 subdirs
属性递归搜索两个目录以显示共同的不同文件的简化示例:
>>> from filecmp import dircmp
>>> def print_diff_files(dcmp):
... for name in dcmp.diff_files:
... print("diff_file %s found in %s and %s" % (name, dcmp.left,
... dcmp.right))
... for sub_dcmp in dcmp.subdirs.values():
... print_diff_files(sub_dcmp)
...
>>> dcmp = dircmp('dir1', 'dir2')
>>> print_diff_files(dcmp)