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

Исходный код: 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.

Возвращает три списка имен файлов: совпадение, несовпадение, ошибки. совпадение содержит список файлов, которые совпадают, несоответствие содержит имена файлов, которые не совпадают, и ошибки перечисляет имена файлов, которые не удалось сравнить. Файлы отображаются в списке ошибки, если они не существуют в одном из каталогов, у пользователя нет разрешения на их чтение или если сравнение не удалось выполнить по какой-либо другой причине.

Параметр 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. игнорировать - это список имен, которые следует игнорировать, и по умолчанию он равен filecmp.DEFAULT_IGNORES. скрыть - это список имен, которые нужно скрыть, по умолчанию используется значение [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, отфильтрованные по параметрам скрывать и игнорировать.

right_list

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

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 (или экземпляры MyDirCmp, если этот экземпляр имеет тип MyDirCmp, подкласс dircmp).

Изменено в версии 3.10: Ранее записи всегда были экземплярами dircmp. Теперь записи имеют тот же тип, что и self, если self является подклассом 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) 
Вернуться на верх