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

---

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

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

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

#### `[filecmp.cmp]filecmp.cmp(f1, f2[, shallow])`

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

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

Файлы, уже сравнённые с помощью этой функции, не будут сравниваться повторно, пока не изменится их сигнатура [`os.stat()`](https://python-all.ru/3.0/library/os.html#os.stat).

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

#### `[filecmp.cmpfiles]filecmp.cmpfiles(dir1, dir2, common[, shallow])`

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

Параметр *common* – это список имён файлов, найденных в обоих каталогах. Параметр *shallow* имеет то же значение и значение по умолчанию, что и для [`filecmp.cmp()`](https://python-all.ru/3.0/library/filecmp.html#filecmp.cmp).

Пример:

```python
>>> import filecmp
>>> filecmp.cmp('undoc.rst', 'undoc.rst')
True
>>> filecmp.cmp('undoc.rst', 'index.rst')
False
```

## [`dircmp`](https://python-all.ru/3.0/library/filecmp.html#filecmp.dircmp) класс

Экземпляры [`dircmp`](https://python-all.ru/3.0/library/filecmp.html#filecmp.dircmp) создаются с помощью этого конструктора:

#### `[filecmp.dircmp]class filecmp.dircmp(a, b[, ignore[, hide]])`

Создаёт новый объект сравнения каталогов для сравнения каталогов *a* и *b*. *ignore* – это список имён для игнорирования; по умолчанию равен `['RCS', 'CVS', 'tags']`. *hide* – это список имён для скрытия; по умолчанию равен `[os.curdir, os.pardir]`.

Класс [`dircmp`](https://python-all.ru/3.0/library/filecmp.html#filecmp.dircmp) предоставляет следующие методы:

#### `[filecmp.dircmp.report]report()`

Выводит (в

`sys.stdout`

) результат сравнения между

*a*

и

*b*

.

#### `[filecmp.dircmp.report_partial_closure]report_partial_closure()`

Выводит результат сравнения между

*a*

и

*b*

и общими непосредственными подкаталогами.

#### `[filecmp.dircmp.report_full_closure]report_full_closure()`

Выводит результат сравнения между

*a*

и

*b*

и общими подкаталогами (рекурсивно).

[`dircmp`](https://python-all.ru/3.0/library/filecmp.html#filecmp.dircmp) предоставляет ряд интересных атрибутов, которые можно использовать для получения различной информации о сравниваемых деревьях каталогов.

Обратите внимание, что через перехватчики [`__getattr__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__getattr__) все атрибуты вычисляются лениво, поэтому нет потери производительности, если используются только те атрибуты, которые легко вычислить.

#### `[filecmp.dircmp.left_list]left_list`

Файлы и подкаталоги в

*a*

, отфильтрованные по

*hide*

и

*ignore*

.

#### `[filecmp.dircmp.right_list]right_list`

Файлы и подкаталоги в

*b*

, отфильтрованные по

*hide*

и

*ignore*

.

#### `[filecmp.dircmp.common]common`

Файлы и подкаталоги, присутствующие в обоих

*a*

и

*b*

.

#### `[filecmp.dircmp.left_only]left_only`

Файлы и подкаталоги только в

*a*

.

#### `[filecmp.dircmp.right_only]right_only`

Файлы и подкаталоги только в

*b*

.

#### `[filecmp.dircmp.common_dirs]common_dirs`

Подкаталоги, присутствующие в обоих

*a*

и

*b*

.

#### `[filecmp.dircmp.common_files]common_files`

Файлы, присутствующие в обоих

*a*

и

*b*

#### `[filecmp.dircmp.common_funny]common_funny`

Имена, присутствующие как в

*a*

, так и в

*b*

, для которых тип различается между dиректориями, или имена, для которых

[`os.stat()`](https://python-all.ru/3.0/library/os.html#os.stat)

сообщает об ошибке.

#### `[filecmp.dircmp.same_files]same_files`

Файлы, совпадающие в обоих каталогах

*a*

и

*b*

.

#### `[filecmp.dircmp.diff_files]diff_files`

Файлы, присутствующие в обоих каталогах

*a*

и

*b*

, содержимое которых различается.

#### `[filecmp.dircmp.funny_files]funny_files`

Файлы, присутствующие в обоих

*a*

и

*b*

, но которые не удалось сравнить.

#### `[filecmp.dircmp.subdirs]subdirs`

Словарь, сопоставляющий имена в

[`common_dirs`](https://python-all.ru/3.0/library/filecmp.html#filecmp.dircmp.common_dirs)

объектам

[`dircmp`](https://python-all.ru/3.0/library/filecmp.html#filecmp.dircmp)

.
