Содержание страницы
filecmp – Сравнение файлов и каталогов¶filecmp – File and Directory Comparisons
Исходный код: Lib/filecmp.py
Модуль filecmp определяет функции для сравнения файлов и каталогов
с различными опциональными компромиссами между скоростью и точностью. Для сравнения файлов
см. также модуль difflib.
Модуль filecmp определяет следующие функции:
-
filecmp.cmp(f1, f2, shallow=True)¶ Сравнивает файлы с именами f1 и f2, возвращая
True, если они кажутся равными,Falseв противном случае.Если shallow равно true, файлы с одинаковыми
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. Это может быть полезно, если файл сравнивается настолько быстро после изменения, что это происходит в пределах разрешения mtime базовой файловой системы.
Новое в версии 3.4.
Класс dircmp¶The dircmp class
-
class
filecmp.dircmp(a, b, ignore=None, hide=None)¶ Создаёт новый объект сравнения каталогов для сравнения каталогов a и b. ignore – это список имён, которые следует игнорировать; по умолчанию
filecmp.DEFAULT_IGNORES. 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)