filecmp
— 文件和目录比较¶
源代码: Lib/filecmp.py
filecmp
模块定义了用于比较文件和目录的函数,具有各种可选的时间/正确性权衡。对于比较文件,另请参阅 difflib
模块。
filecmp
模块定义了以下函数
- filecmp.cmp(f1, f2, shallow=True)¶
比较名为 *f1* 和 *f2* 的文件,如果它们看起来相等则返回
True
,否则返回False
。如果 *shallow* 为 true 且两个文件的
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 类型,则是 MyDirCmp 实例,MyDirCmp 是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)