# 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()`具有相同的含义和默认值。

  例如，`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。 忽略是要忽略的名称列表，默认为`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中的文件。

  `common_funny`

    a和b中的名称，以使类型在目录之间不同，或`os.stat()`报告错误的名称。

  `same_files`

    a和b中相同的文件，使用该类的文件比较运算符。

  `diff_files`

    a和b中，根据该类的文件比较操作符，其内容不同的文件。

  `funny_files`

    a和b中无法比较的文件。

  `subdirs`

    将`common_dirs`中的名称映射到`dircmp`对象的字典。

`filecmp.``DEFAULT_IGNORES`

  版本3.4中的新功能。

  默认情况下，由`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)