filecmp.dircmp
это путь. Но он не сравнивает содержимое файлов с одинаковым путем в двух сравниваемых каталогах. Вместо этого filecmp.dircmp
смотрит только на атрибуты файлов. Поскольку dircmp
является классом, вы исправляете это с помощью подкласса dircmp
и переопределяете его функцию phase3
, которая сравнивает файлы, чтобы убедиться, что содержимое сравнивается вместо сравнения os.stat
атрибутов.
import filecmp
class dircmp(filecmp.dircmp):
"""
Compare the content of dir1 and dir2. In contrast with filecmp.dircmp, this
subclass compares the content of files with the same path.
"""
def phase3(self):
"""
Find out differences between common files.
Ensure we are using content comparison with shallow=False.
"""
fcomp = filecmp.cmpfiles(self.left, self.right, self.common_files,
shallow=False)
self.same_files, self.diff_files, self.funny_files = fcomp
Тогда вы можете использовать это, чтобы вернуть логическое значение:
import os.path
def is_same(dir1, dir2):
"""
Compare two directory trees content.
Return False if they differ, True is they are the same.
"""
compared = dircmp(dir1, dir2)
if (compared.left_only or compared.right_only or compared.diff_files
or compared.funny_files):
return False
for subdir in compared.common_dirs:
if not is_same(os.path.join(dir1, subdir), os.path.join(dir2, subdir)):
return False
return True
В случае, если вы хотите повторно использовать этот фрагмент кода, он настоящим предназначен для Public Domain или Creative Commons CC0 по вашему выбору (в дополнение к лицензии по умолчанию CC-BY-SA, предоставленной SO).