filecmp — Сравнение файлов и каталогов


Модуль 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. match содержит список файлов, которые соответствуют, 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. Это может быть полезно, если файл сравнивается так быстро после его изменения, что он находится в пределах временного разрешения базовой файловой системы.

Добавлено в версии 3.4.

Класс dircmp

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

Создать новый объект сравнения каталогов для сравнения каталогов a и b. ignore - список игнорируемых имен, по умолчанию используется значение filecmp.DEFAULT_IGNORES. hide - список имен для скрытия, по умолчанию используется значение [os.curdir, os.pardir].

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

Класс dircmp предоставляет следующие методы:

report()

Печать (по sys.stdout) сравнения a и b.

report_partial_closure()

Печать сравнения между a и b и общими ближайшими подкаталогами.

report_full_closure()

Печать сравнения между a и b и общими подкаталогами (рекурсивно).

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

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

left

Каталог a.

right

Каталог b.

left_list

Файлы и подкаталоги в a, отфильтрованные по hide и ignore.

right_list

Файлы и подкаталоги в b, отфильтрованные по hide и ignore.

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)