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)¶
构造一个新的目录比较对象,用于比较目录 a 和 b。 ignore 是要忽略的名称列表,默认为
filecmp.DEFAULT_IGNORES
。 hide 是要隐藏的名称列表,默认为[os.curdir, os.pardir]
。dircmp
类通过执行filecmp.cmp()
中描述的 *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
实例(如果此实例是dircmp
的子类 MyDirCmp,则为 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)