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. Это может быть полезно, если файл сравнивается сразу после его изменения, так что время последнего изменения находится в пределах разрешения времени изменения подлежащей файловой системы.
Введено в версии 3.4.
Объекты dircmp
-
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.
-
-
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.8/library/filecmp.html