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。mtach包含匹配文件的列表,mismatch包含不匹配文件的列表,errors列出无法比较的文件的名称。如果文件在其中一个目录中不存在,用户没有足够的权限读取它们,或者某些其他原因不可比较,那么它们将在errors中列出。
shallow参数与
filecmp.cmp()
具有相同的含义和默认值。For example,
cmpfiles('a', 'b', ['c', 'd/e'])
will comparea/c
withb/c
anda/d/e
withb/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。 忽略是要忽略的名称列表,默认为
filecmp.DEFAULT_IGNORES
。隐藏是要隐藏的名称列表,默认为[os.curdir, os.pardir]
。dircmp
类通过对filecmp.cmp()
所述执行浅比较来比较文件。dircmp
类提供以下方法:-
report
()¶ 将a和b之间的比较打印(到
sys.stdout
)。
-
report_partial_closure
()¶ 打印a和b以及共有的直接子目录之间的比较。
-
report_full_closure
()¶ 打印a和b以及共有的子目录(递归地)之间的比较。
dircmp
类提供了许多有趣的属性,可用于获取有关正在比较的目录树的各种位信息。注意,通过
__getattr__()
钩子,所有属性都是惰性计算的,因此如果只使用那些轻量级计算的属性,则没有速度损失。-
left
¶ 目录a。
-
right
¶ 目录b。
-
left_list
¶ 通过hide和ignore筛选后,a中的文件和子目录。
-
right_list
¶ 通过hide和ignore筛选后,b中的文件和子目录。
-
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)