Сообщить об ошибке.

Класс dircmp() модуля filecmp в Python

Сравнить содержимое двух каталогов

Синтаксис:

import filecmp

dc = filecmp.dircmp(a, b, ignore=None, hide=None)

Параметры:

  • a, b - имена каталогов,
  • ignore=None - список имен игнорируемых файлов,
  • hide=None - список имен скрываемых файлов.

Возвращаемое значение:

Описание:

Класс dircmp() модуля filecmp возвращает новый объект сравнения каталогов a и b.

  • Аргумент ignore - это список имен, которые нужно игнорировать, по умолчанию это filecmp.DEFAULT_IGNORES.
  • Аргумент hide - это список имен, которые нужно скрыть, по умолчанию используется [os.curdir, os.pardir]

.

Класс filecmp.dircmp() сравнивает файлы, выполняя поверхностные сравнения, как описано в функции filecmp.cmp().

Класс filecmp.dircmp() предлагает ряд интересных атрибутов, которые можно использовать для получения различной информации о сравниваемых деревьях каталогов.

Обратите внимание, что с помощью перехватчиков __getattr__() все атрибуты вычисляются лениво, поэтому нет потери скорости, если используются только те атрибуты, которые легки для вычисления.

Методы и атрибуты объекта dircmp:


dc.report():

Метод dc.report() выводит на sys.stdout сравнение между каталогами a и b.

dc.report_partial_closure():

Метод dc.report_partial_closure() выводит на sys.stdout сравнение между непосредственно общими подкаталогами, содержащиеся в сравниваемых каталогах a и b.

dc.report_full_closure():

Метод dc.report_full_closure() выводит на sys.stdout сравнение между общими подкаталогами рекурсивно, содержащиеся в сравниваемых каталогах a и b.

dc.left:

Атрибут dc.left возвращает название каталога а.

dc.right:

Атрибут dc.right возвращает название каталога b.

dc.left_list:

Атрибут dc.left_list возвращает список имен файлов и подкаталогов а с учетом примененных фильтров ignore и hide, если они заданы.

dc.right_list:

Атрибут dc.right_list возвращает список имен файлов и подкаталогов b с учетом примененных фильтров ignore и hide, если они заданы.

dc.common:

Атрибут dc.common возвращает список общих имен файлов и подкаталогов, содержащиеся в сравниваемых каталогах a и b.

dc.left_only:

Атрибут dc.left_only возвращает список имен файлов и подкаталогов, содержащиеся только в директории a.

dc.right_only:

Атрибут dc.right_only возвращает список имен файлов и подкаталогов, содержащиеся только в директории b.

dc.common_dirs:

Атрибут dc.common_dirs возвращает список общих имен подкаталогов, содержащиеся в сравниваемых каталогах a и b.

dc.common_files:

Атрибут dc.common_files возвращает список общих имен файлов, содержащиеся в сравниваемых каталогах a и b.

dc.common_funny:

Атрибут dc.common_funny возвращает список файлов и подкаталогов, содержащиеся в сравниваемых каталогах a и b, которые имеют разные типы или для которых os.stat() сообщает об ошибке.

dc.same_files:

Атрибут dc.same_files возвращает список файлов, которые идентичны в обоих каталогах a и b, используется оператор сравнения файлов.

dc.diff_files:

Атрибут dc.diff_files возвращает список файлов, находящихся в сравниваемых каталогах a и b, содержимое которых отличается в зависимости от оператора сравнения файлов.

dc.funny_files:

Атрибут dc.funny_files возвращает список файлов, находящихся в обоих каталогах a и b, но не могут быть сравнены.

dc.subdirs:

Атрибут dc.subdirs возвращает словарь, отображающий имена в dircmp.common_dirs для объектов dircmp.

import filecmp

def print_diff_files(dcmp):
    for name in dcmp.diff_files:
        print(f`diff_file {name} found in {dcmp.left} and {dcmp.right}`)
    for sub_dcmp in dcmp.subdirs.values():
        print_diff_files(sub_dcmp)

dcmp = dircmp('path/to/dir1', 'path/to/dir2') 
print_diff_files(dcmp)

Примеры:

Файлы и подкаталоги, содержащиеся в сравниваемых каталогах сохраняются в dc.left_list и dc.right_list.

>>> import filecmp
>>> dc = filecmp.dircmp('/path/to/dir1', '/path/to/dir2')
>>> dc.left_list
# ['common_dir',
#  'common_file',
#  'contents_differ',
#  'dir_only_in_dir1',
#  'file_in_dir1',
#  'file_only_in_dir1']

>>> dc.right_list
# ['common_dir',
#  'common_file',
#  'contents_differ',
#  'dir_only_in_dir2',
#  'file_in_dir1',
#  'file_only_in_dir2']

Входные данные могут быть отфильтрованы путем передачи списка имен, которые следует игнорировать. По умолчанию имена RCS, CVS и теги игнорируются. В этом случае common_file исключается из списка сравниваемых файлов.

>>> import filecmp
>>> dc = filecmp.dircmp('/path/to/dir1', '/path/to/dir2',
                    ignore=['common_file'])

>>> dc.left_list
# ['common_dir',
#  'contents_differ',
#  'dir_only_in_dir1',
#  'file_in_dir1',
#  'file_only_in_dir1']

>>>dc.right_list
# ['common_dir',
#  'contents_differ',
#  'dir_only_in_dir2',
#  'file_in_dir1',
#  'file_only_in_dir2']

Имена файлов, общих для обоих входных каталогов, сохраняются в dc.common, а файлы, уникальные для каждого каталога, перечислены в dc.left_only и dc.right_only.

>>> import filecmp
>>> dc = filecmp.dircmp('example/dir1', 'example/dir2')
>>> dc.common
# ['common_dir', 'common_file', 'contents_differ', 'file_in_dir1']
>>> dc.left_only
# ['dir_only_in_dir1', 'file_only_in_dir1']
>>> dc.right_only
# ['dir_only_in_dir2', 'file_only_in_dir2']

Общие члены могут быть далее разбиты на файлы, каталоги и funny элементы, которые имеет разные типы в двух каталогах или где есть ошибка от os.stat().

В данных примера элемент с именем file_in_dir1 представляет собой файл в одном каталоге и подкаталог в другом, поэтому он отображается в funny списке.

>>> import filecmp
>>> dc = filecmp.dircmp('example/dir1', 'example/dir2')
>>> dc.common
# ['common_dir', 'common_file', 'contents_differ', 'file_in_dir1']
>>> dc.common_dirs
# ['common_dir']
>>> dc.common_files
# ['common_file', 'contents_differ']
>>> dc.common_funny
# ['file_in_dir1']

Различия между файлами разбиты аналогичным образом.

>>> import filecmp
>>> dc = filecmp.dircmp('example/dir1', 'example/dir2')
>>> dc.same_files
# ['common_file']
>>> dc.diff_files
# ['contents_differ']
>>> dc.funny_files
# []

Наконец, подкаталоги также сохраняются, что позволяет легкое рекурсивное сравнение.

>>> import filecmp
>>> dc = filecmp.dircmp('example/dir1', 'example/dir2')
>>> dc.subdirs
# {'common_dir': <filecmp.dircmp object at 0x1101fe710>}