Содержание страницы
10.4. filecmp – Сравнение файлов и каталогов¶filecmp – File and Directory Comparisons
Исходный код: Lib/filecmp.py
Модуль filecmp определяет функции для сравнения файлов и каталогов с различными компромиссами между скоростью и точностью. Для сравнения файлов также смотрите модуль difflib.
Модуль filecmp определяет следующие функции:
- filecmp.cmp(f1, f2, shallow=True)¶
Сравнивает файлы с именами f1 и f2, возвращая True, если они кажутся равными, иначе False.
Если shallow не задан или равен False, файлы с одинаковыми сигнатурами os.stat() считаются равными.
Файлы, уже сравнённые с помощью этой функции, не будут сравниваться повторно, пока не изменится их сигнатура os.stat().
Обратите внимание, что эта функция не вызывает внешние программы, что обеспечивает её переносимость и эффективность.
- 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' будут в одном из трёх возвращаемых списков.
Пример:
>>> import filecmp
>>> filecmp.cmp('undoc.rst', 'undoc.rst')
True
>>> filecmp.cmp('undoc.rst', 'index.rst')
False
10.4.1. Класс dircmp¶The dircmp class
Экземпляры dircmp создаются с помощью этого конструктора:
- class filecmp.dircmp(a, b, ignore=None, hide=None)¶
Создаёт новый объект сравнения каталогов для сравнения каталогов a и b. ignore – это список имён для игнорирования; по умолчанию равен ['RCS', 'CVS', 'tags']. 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, для которых тип различается между dиректориями, или имена, для которых 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)