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_partial_closure()
,dc.report_full_closure()
,а
dc.left
,b
dc.right
,а
с учетом ignore
и hide
dc.left_list
,b
с учетом ignore
и hide
dc.right_list
,dc.common
,а
dc.left_only
,b
dc.right_only
,dc.common_dirs
,dc.common_files
,dc.common_funny
,dc.same_files
,dc.diff_files
,dc.funny_files
,dircmp.common_dirs
dc.subdirs
.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>}