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