python – 递归dircmp(比较两个目录以确保它们具有相同的文件和子目录) - 代码日志

python – 递归dircmp(比较两个目录以确保它们具有相同的文件和子目录)

从我观察到的filecmp.dircmp是递归的,但不足以满足我的需要,至少在py2中。我想比较两个目录及其所有包含的文件。这是否存在,或者我需要构建(例如使用os.walk)。我更喜欢预制,其他人已经完成了单元测试:)

实际的“比较”可能是拙劣的(例如忽略权限),如果这有帮助。

我想要一些布尔值,而report_full_closure是一个打印报告。它也只会下​​降常见的子系统。 AFIAC,如果他们在左边或右边有任何东西只有那些是不同的目录。我使用os.walk来构建它。

这是与filecmp模块的比较功能的替代实现。它使用递归而不是os.walk,所以它有点简单。然而,它不会简单地通过使用common_dirs和subdirs属性来递归,因为在这种情况下,我们将隐式使用默认的“浅”实现文件比较,这可能不是你想要的。在下面的实现中,当比较具有相同名称的文件时,我们总是只比较其内容。

import filecmp
import os.path

def are_dir_trees_equal(dir1, dir2):
    """
    Compare two directories recursively. Files in each directory are
    assumed to be equal if their names and contents are equal.

    @param dir1: First directory path
    @param dir2: Second directory path

    @return: True if the directory trees are the same and 
        there were no errors while accessing the directories or files, 
        False otherwise.
   """

    dirs_cmp = filecmp.dircmp(dir1, dir2)
    if len(dirs_cmp.left_only)>0 or len(dirs_cmp.right_only)>0 or \
        len(dirs_cmp.funny_files)>0:
        return False
    (_, mismatch, errors) =  filecmp.cmpfiles(
        dir1, dir2, dirs_cmp.common_files, shallow=False)
    if len(mismatch)>0 or len(errors)>0:
        return False
    for common_dir in dirs_cmp.common_dirs:
        new_dir1 = os.path.join(dir1, common_dir)
        new_dir2 = os.path.join(dir2, common_dir)
        if not are_dir_trees_equal(new_dir1, new_dir2):
            return False
    return True
http://stackoverflow.com/questions/4187564/recursive-dircmp-compare-two-directories-to-ensure-they-have-the-same-files-and

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:python – 递归dircmp(比较两个目录以确保它们具有相同的文件和子目录)