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