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.
Возвращает три списка имён файлов: 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(или экземплярами MyDirCmp, если этот экземпляр типа MyDirCmp, подкласса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–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.10/library/filecmp.html