> **Источник:** https://python-all.ru/3.13/library/filecmp.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# `filecmp` – Сравнение файлов и каталогов

**Исходный код:** [Lib/filecmp.py](https://python-all.ru/src/3.13/Lib/filecmp.py)

---

Модуль `filecmp` определяет функции для сравнения файлов и каталогов с различными опциональными компромиссами между скоростью и точностью. Для сравнения файлов см. также модуль [`difflib`](https://python-all.ru/3.13/library/difflib.html#module-difflib).

Модуль `filecmp` определяет следующие функции:

#### `filecmp.cmp(f1, f2, shallow=True)`

Сравнивает файлы с именами *f1* и *f2*, возвращая `True`, если они кажутся равными, `False` в противном случае.

Если *shallow* истинно и сигнатуры [`os.stat()`](https://python-all.ru/3.13/library/os.html#os.stat) (тип файла, размер и время изменения) обоих файлов идентичны, файлы считаются равными.

В противном случае файлы считаются различными, если их размеры или содержимое различаются.

Обратите внимание, что эта функция не вызывает внешние программы, что обеспечивает её переносимость и эффективность.

Эта функция использует кеш для предыдущих сравнений и их результатов, при этом записи кеша становятся недействительными, если информация [`os.stat()`](https://python-all.ru/3.13/library/os.html#os.stat) о файле изменяется. Весь кеш можно очистить с помощью [`clear_cache()`](https://python-all.ru/3.13/library/filecmp.html#filecmp.clear_cache).

#### `filecmp.cmpfiles(dir1, dir2, common, shallow=True)`

Сравнивает файлы в двух каталогах *dir1* и *dir2*, чьи имена указаны в *common*.

Возвращает три списка имён файлов: *match*, *mismatch*, *errors*. *match* содержит список совпадающих файлов, *mismatch* содержит имена тех, которые не совпадают, а *errors* перечисляет имена файлов, которые не удалось сравнить. Файлы попадают в *errors*, если они отсутствуют в одном из каталогов, у пользователя нет прав на их чтение или сравнение не удалось выполнить по другой причине.

Параметр *shallow* имеет тот же смысл и значение по умолчанию, что и для [`filecmp.cmp()`](https://python-all.ru/3.13/library/filecmp.html#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`](https://python-all.ru/3.13/library/filecmp.html#filecmp.dircmp)

#### `class filecmp.dircmp(a, b, ignore=None, hide=None, *, shallow=True)`

Создаёт новый объект сравнения каталогов для сравнения каталогов *a* и *b*. *ignore* – это список имён, которые следует игнорировать; по умолчанию [`filecmp.DEFAULT_IGNORES`](https://python-all.ru/3.13/library/filecmp.html#filecmp.DEFAULT_IGNORES). *hide* – это список имён, которые следует скрывать; по умолчанию `[os.curdir, os.pardir]`.

Класс `dircmp` сравнивает файлы, выполняя *shallow*-сравнения, как описано для [`filecmp.cmp()`](https://python-all.ru/3.13/library/filecmp.html#filecmp.cmp), по умолчанию используя параметр *shallow*.

Изменено в версии 3.13: Добавлен параметр *shallow*.

Класс `dircmp` предоставляет следующие методы:

#### `report()`

Выводит (в [`sys.stdout`](https://python-all.ru/3.13/library/sys.html#sys.stdout)) результат сравнения между *a* и *b*.

#### `report_partial_closure()`

Выводит результат сравнения между *a* и *b* и общими непосредственными подкаталогами.

#### `report_full_closure()`

Выводит результат сравнения между *a* и *b* и общими подкаталогами (рекурсивно).

Класс `dircmp` предоставляет ряд интересных атрибутов, которые могут быть использованы для получения различной информации о сравниваемых деревьях каталогов.

Обратите внимание, что благодаря [`__getattr__()`](https://python-all.ru/3.13/reference/datamodel.html#object.__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()`](https://python-all.ru/3.13/library/os.html#os.stat) сообщает об ошибке.

#### `same_files`

Файлы, которые идентичны в обоих *a* и *b*, с использованием оператора сравнения файлов класса.

#### `diff_files`

Файлы, присутствующие в обоих *a* и *b*, содержимое которых различается согласно оператору сравнения файлов класса.

#### `funny_files`

Файлы, присутствующие в обоих *a* и *b*, но которые не удалось сравнить.

#### `subdirs`

Словарь, сопоставляющий имена из [`common_dirs`](https://python-all.ru/3.13/library/filecmp.html#filecmp.dircmp.common_dirs) с экземплярами `dircmp` (или экземплярами MyDirCmp, если данный экземпляр имеет тип MyDirCmp, который является подклассом `dircmp`).

Изменено в версии 3.10: Ранее записи всегда были экземплярами `dircmp`. Теперь записи имеют тот же тип, что и *self*, если *self* является подклассом `dircmp`.

#### `filecmp.DEFAULT_IGNORES`

Добавлено в версии 3.4.

Список каталогов, игнорируемых [`dircmp`](https://python-all.ru/3.13/library/filecmp.html#filecmp.dircmp) по умолчанию.

Вот упрощённый пример использования атрибута `subdirs` для рекурсивного поиска по двум каталогам с целью отображения общих отличающихся файлов:

```python
>>> 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)
```
