filecmp.md
1> **Источник:** https://python-all.ru/3.8/library/filecmp.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`filecmp`](https://python-all.ru/3.8/library/filecmp.html#module-filecmp) – Сравнение файлов и каталогов89**Исходный код:** [Lib/filecmp.py](https://python-all.ru/src/3.8/Lib/filecmp.py)1011---1213Модуль [`filecmp`](https://python-all.ru/3.8/library/filecmp.html#module-filecmp) определяет функции для сравнения файлов и каталогов с различными опциональными компромиссами между скоростью и точностью. Для сравнения файлов см. также модуль [`difflib`](https://python-all.ru/3.8/library/difflib.html#module-difflib).1415Модуль [`filecmp`](https://python-all.ru/3.8/library/filecmp.html#module-filecmp) определяет следующие функции:1617#### `filecmp.cmp(f1, f2, shallow=True)`1819Сравнивает файлы с именами *f1* и *f2*, возвращая `True`, если они кажутся равными, `False` в противном случае.2021Если *shallow* равно true, файлы с одинаковыми [`os.stat()`](https://python-all.ru/3.8/library/os.html#os.stat) сигнатурами считаются равными. В противном случае сравнивается содержимое файлов.2223Обратите внимание, что эта функция не вызывает внешние программы, что обеспечивает её переносимость и эффективность.2425Эта функция использует кеш для предыдущих сравнений и их результатов, при этом записи кеша становятся недействительными, если информация [`os.stat()`](https://python-all.ru/3.8/library/os.html#os.stat) о файле изменяется. Весь кеш можно очистить с помощью [`clear_cache()`](https://python-all.ru/3.8/library/filecmp.html#filecmp.clear_cache).2627#### `filecmp.cmpfiles(dir1, dir2, common, shallow=True)`2829Сравнивает файлы в двух каталогах *dir1* и *dir2*, чьи имена указаны в *common*.3031Возвращает три списка имён файлов: *match*, *mismatch*, *errors*. *match* содержит список совпадающих файлов, *mismatch* содержит имена тех, которые не совпадают, а *errors* перечисляет имена файлов, которые не удалось сравнить. Файлы попадают в *errors*, если они отсутствуют в одном из каталогов, у пользователя нет прав на их чтение или сравнение не удалось выполнить по другой причине.3233Параметр *shallow* имеет тот же смысл и значение по умолчанию, что и для [`filecmp.cmp()`](https://python-all.ru/3.8/library/filecmp.html#filecmp.cmp).3435Например, `cmpfiles('a', 'b', ['c', 'd/e'])` сравнит `a/c` с `b/c` и `a/d/e` с `b/d/e`. `'c'` и `'d/e'` окажутся каждый в одном из трёх возвращаемых списков.3637#### `filecmp.clear_cache()`3839Очищает кеш filecmp. Это может быть полезно, если файл сравнивается настолько быстро после изменения, что это происходит в пределах разрешения mtime базовой файловой системы.4041Новое в версии 3.4.4243## Класс [`dircmp`](https://python-all.ru/3.8/library/filecmp.html#filecmp.dircmp)4445#### `class filecmp.dircmp(a, b, ignore=None, hide=None)`4647Создаёт новый объект сравнения каталогов для сравнения каталогов *a* и *b*. *ignore* – это список имён, которые следует игнорировать; по умолчанию [`filecmp.DEFAULT_IGNORES`](https://python-all.ru/3.8/library/filecmp.html#filecmp.DEFAULT_IGNORES). *hide* – это список имён, которые следует скрывать; по умолчанию `[os.curdir, os.pardir]`.4849Класс [`dircmp`](https://python-all.ru/3.8/library/filecmp.html#filecmp.dircmp) сравнивает файлы, выполняя *поверхностное* сравнение, как описано для [`filecmp.cmp()`](https://python-all.ru/3.8/library/filecmp.html#filecmp.cmp).5051Класс [`dircmp`](https://python-all.ru/3.8/library/filecmp.html#filecmp.dircmp) предоставляет следующие методы:5253#### `report()`5455Выводит (в [`sys.stdout`](https://python-all.ru/3.8/library/sys.html#sys.stdout)) результат сравнения между *a* и *b*.5657#### `report_partial_closure()`5859Выводит результат сравнения между *a* и *b* и общими непосредственными подкаталогами.6061#### `report_full_closure()`6263Выводит результат сравнения между *a* и *b* и общими подкаталогами (рекурсивно).6465Класс [`dircmp`](https://python-all.ru/3.8/library/filecmp.html#filecmp.dircmp) предоставляет ряд интересных атрибутов, которые могут быть использованы для получения различной информации о сравниваемых деревьях каталогов.6667Обратите внимание, что благодаря [`__getattr__()`](https://python-all.ru/3.8/reference/datamodel.html#object.__getattr__) все атрибуты вычисляются лениво, поэтому снижения производительности не происходит, если используются только те атрибуты, которые легковесны для вычисления.6869#### `left`7071Каталог *a*.7273#### `right`7475Каталог *b*.7677#### `left_list`7879Файлы и подкаталоги в *a*, отфильтрованные по *hide* и *ignore*.8081#### `right_list`8283Файлы и подкаталоги в *b*, отфильтрованные по *hide* и *ignore*.8485#### `common`8687Файлы и подкаталоги, присутствующие в обоих *a* и *b*.8889#### `left_only`9091Файлы и подкаталоги только в *a*.9293#### `right_only`9495Файлы и подкаталоги только в *b*.9697#### `common_dirs`9899Подкаталоги, присутствующие в обоих *a* и *b*.100101#### `common_files`102103Файлы, присутствующие в обоих *a* и *b*.104105#### `common_funny`106107Имена, присутствующие в обоих *a* и *b*, для которых тип отличается между каталогами, или имена, для которых [`os.stat()`](https://python-all.ru/3.8/library/os.html#os.stat) сообщает об ошибке.108109#### `same_files`110111Файлы, которые идентичны в обоих *a* и *b*, с использованием оператора сравнения файлов класса.112113#### `diff_files`114115Файлы, присутствующие в обоих *a* и *b*, содержимое которых различается согласно оператору сравнения файлов класса.116117#### `funny_files`118119Файлы, присутствующие в обоих *a* и *b*, но которые не удалось сравнить.120121#### `subdirs`122123Словарь, отображающий имена из [`common_dirs`](https://python-all.ru/3.8/library/filecmp.html#filecmp.dircmp.common_dirs) в [`dircmp`](https://python-all.ru/3.8/library/filecmp.html#filecmp.dircmp) объекты.124125#### `filecmp.DEFAULT_IGNORES`126127Новое в версии 3.4.128129Список каталогов, игнорируемых [`dircmp`](https://python-all.ru/3.8/library/filecmp.html#filecmp.dircmp) по умолчанию.130131Вот упрощённый пример использования атрибута `subdirs` для рекурсивного поиска по двум каталогам с целью отображения общих отличающихся файлов:132133```python134>>> from filecmp import dircmp135>>> def print_diff_files(dcmp):136... for name in dcmp.diff_files:137... print("diff_file %s found in %s and %s" % (name, dcmp.left,138... dcmp.right))139... for sub_dcmp in dcmp.subdirs.values():140... print_diff_files(sub_dcmp)141...142>>> dcmp = dircmp('dir1', 'dir2') 143>>> print_diff_files(dcmp) 144```145