11.5. 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 新版功能.
11.5.1. dircmp
类¶
-
class
filecmp.
dircmp
(a, b, ignore=None, hide=None)¶ 构造一个新的目录比较对象,比较目录 a 和 b。 ignore 是要忽略的名称列表,默认为
filecmp.DEFAULT_IGNORES
。 hide 是要隐藏的名称列表,默认为[os.curdir, os.pardir]
。dircmp
类通过进行 shallow 比较来比较文件,如针对filecmp.cmp()
所描述的。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
对象的字典。
-
下面是使用 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)