filecmp — Сравнение файлов и каталогов
Исходный код: Lib/filecmp.py
Модуль 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. Это может быть полезно, если файл сравнивается сразу после изменения, так что он попадает в разрешение по времени последнего изменения на основе файловой системы.
Введено в версии 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)
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.9/library/filecmp.html