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
сравнивает файлы, выполняя мелкие сравнения, как описано для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)