filecmp.md
1> **Источник:** https://python-all.ru/3.1/library/filecmp.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 10.4. `filecmp` – Сравнение файлов и каталогов89Модуль `filecmp` определяет функции для сравнения файлов и каталогов, с различными опциональными компромиссами по времени/точности. Для сравнения файлов см. также модуль [`difflib`](https://python-all.ru/3.1/library/difflib.html#module-difflib).1011Модуль `filecmp` определяет следующие функции:1213#### `filecmp.cmp(f1, f2, shallow=True)`1415Сравнивает файлы с именами *f1* и *f2*, возвращая `True`, если они кажутся равными, иначе `False`.1617Если *shallow* не задан или равен False, файлы с одинаковыми сигнатурами [`os.stat()`](https://python-all.ru/3.1/library/os.html#os.stat) считаются равными.1819Файлы, уже сравнённые с помощью этой функции, не будут сравниваться повторно, пока не изменится их сигнатура [`os.stat()`](https://python-all.ru/3.1/library/os.html#os.stat).2021Обратите внимание, что эта функция не вызывает внешние программы, что обеспечивает её переносимость и эффективность.2223#### `filecmp.cmpfiles(dir1, dir2, common, shallow=True)`2425Сравнивает файлы в двух каталогах *dir1* и *dir2*, чьи имена указаны в *common*.2627Возвращает три списка имён файлов: *match*, *mismatch*, *errors*. *match* содержит список совпадающих файлов, *mismatch* содержит имена тех, которые не совпадают, а *errors* перечисляет имена файлов, которые не удалось сравнить. Файлы попадают в *errors*, если они отсутствуют в одном из каталогов, у пользователя нет прав на их чтение или сравнение не удалось выполнить по другой причине.2829Параметр *shallow* имеет тот же смысл и значение по умолчанию, что и для [`filecmp.cmp()`](https://python-all.ru/3.1/library/filecmp.html#filecmp.cmp).3031Например, `cmpfiles('a', 'b', ['c', 'd/e'])` сравнит `a/c` с `b/c` и `a/d/e` с `b/d/e`. `'c'` и `'d/e'` будут в одном из трёх возвращаемых списков.3233Пример:3435```python36>>> import filecmp37>>> filecmp.cmp('undoc.rst', 'undoc.rst')38True39>>> filecmp.cmp('undoc.rst', 'index.rst')40False41```4243## 10.4.1. Класс [`dircmp`](https://python-all.ru/3.1/library/filecmp.html#filecmp.dircmp)4445Экземпляры [`dircmp`](https://python-all.ru/3.1/library/filecmp.html#filecmp.dircmp) создаются с помощью этого конструктора:4647#### `class filecmp.dircmp(a, b, ignore=None, hide=None)`4849Создаёт новый объект сравнения каталогов для сравнения каталогов *a* и *b*. *ignore* – это список имён для игнорирования; по умолчанию равен `['RCS', 'CVS', 'tags']`. *hide* – это список имён для скрытия; по умолчанию равен `[os.curdir, os.pardir]`.5051Класс [`dircmp`](https://python-all.ru/3.1/library/filecmp.html#filecmp.dircmp) предоставляет следующие методы:5253#### `report()`5455Выводит (в5657`sys.stdout`5859) результат сравнения между6061*a*6263и6465*b*6667.6869#### `report_partial_closure()`7071Выводит результат сравнения между7273*a*7475и7677*b*7879и общими непосредственными подкаталогами.8081#### `report_full_closure()`8283Выводит результат сравнения между8485*a*8687и8889*b*9091и общими подкаталогами (рекурсивно).9293[`dircmp`](https://python-all.ru/3.1/library/filecmp.html#filecmp.dircmp) предоставляет ряд интересных атрибутов, которые можно использовать для получения различной информации о сравниваемых деревьях каталогов.9495Обратите внимание, что через перехватчики [`__getattr__()`](https://python-all.ru/3.1/reference/datamodel.html#object.__getattr__) все атрибуты вычисляются лениво, поэтому нет потери производительности, если используются только те атрибуты, которые легко вычислить.9697#### `left_list`9899Файлы и подкаталоги в100101*a*102103, отфильтрованные по104105*hide*106107и108109*ignore*110111.112113#### `right_list`114115Файлы и подкаталоги в116117*b*118119, отфильтрованные по120121*hide*122123и124125*ignore*126127.128129#### `common`130131Файлы и подкаталоги, присутствующие в обоих132133*a*134135и136137*b*138139.140141#### `left_only`142143Файлы и подкаталоги только в144145*a*146147.148149#### `right_only`150151Файлы и подкаталоги только в152153*b*154155.156157#### `common_dirs`158159Подкаталоги, присутствующие в обоих160161*a*162163и164165*b*166167.168169#### `common_files`170171Файлы, присутствующие в обоих172173*a*174175и176177*b*178179#### `common_funny`180181Имена, присутствующие как в182183*a*184185, так и в186187*b*188189, для которых тип различается между dиректориями, или имена, для которых190191[`os.stat()`](https://python-all.ru/3.1/library/os.html#os.stat)192193сообщает об ошибке.194195#### `same_files`196197Файлы, совпадающие в обоих каталогах198199*a*200201и202203*b*204205.206207#### `diff_files`208209Файлы, присутствующие в обоих каталогах210211*a*212213и214215*b*216217, содержимое которых различается.218219#### `funny_files`220221Файлы, присутствующие в обоих222223*a*224225и226227*b*228229, но которые не удалось сравнить.230231#### `subdirs`232233Словарь, сопоставляющий имена из234235[`common_dirs`](https://python-all.ru/3.1/library/filecmp.html#filecmp.dircmp.common_dirs)236237объектам238239[`dircmp`](https://python-all.ru/3.1/library/filecmp.html#filecmp.dircmp)240241.242