Документация Python неофициальный перевод
Содержание страницы

10.5. filecmp – сравнение файлов и каталоговfilecmp – File and Directory Comparisons

Исходный код: Lib/filecmp.py


Модуль filecmp определяет функции для сравнения файлов и каталогов с различными опциональными компромиссами между скоростью и точностью. Для сравнения файлов см. также модуль difflib.

Модуль filecmp определяет следующие функции:

filecmp.cmp(f1, f2[, shallow])

Сравнивает файлы с именами f1 и f2, возвращая True, если они кажутся равными, False в противном случае.

Если shallow не задан или равен истине, файлы с одинаковыми os.stat() сигнатурами считаются равными.

Файлы, которые уже сравнивались с помощью этой функции, не будут сравниваться повторно, если не изменится их os.stat() сигнатура.

Обратите внимание, что эта функция не вызывает внешние программы, что обеспечивает её переносимость и эффективность.

filecmp.cmpfiles(dir1, dir2, common[, shallow])

Сравнивает файлы в двух каталогах 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' окажутся каждый в одном из трёх возвращаемых списков.

Пример:

>>> import filecmp
>>> filecmp.cmp('undoc.rst', 'undoc.rst') 
True
>>> filecmp.cmp('undoc.rst', 'index.rst') 
False

10.5.1. Класс dircmpThe dircmp class

Экземпляры dircmp создаются с помощью этого конструктора:

class filecmp.dircmp(a, b[, ignore[, hide]])

Создаёт новый объект сравнения каталогов для сравнения каталогов a и b. Параметр ignore – это список имён, которые следует игнорировать; по умолчанию ['RCS', 'CVS', 'tags']. Параметр hide – список имён для скрытия; по умолчанию [os.curdir, os.pardir].

Класс dircmp сравнивает файлы, выполняя поверхностное сравнение, как описано для 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.

Вот упрощённый пример использования атрибута 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)