Документация Python неофициальный перевод

filecmp.md

145 строк · 8.4 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.2/library/filecmp.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 10.4. [`filecmp`](https://python-all.ru/3.2/library/filecmp.html#module-filecmp) – Сравнение файлов и каталогов89**Исходный код:** [Lib/filecmp.py](https://python-all.ru/src/3.2/Lib/filecmp.py)1011---1213Модуль [`filecmp`](https://python-all.ru/3.2/library/filecmp.html#module-filecmp) определяет функции для сравнения файлов и каталогов с различными компромиссами между скоростью и точностью. Для сравнения файлов также смотрите модуль [`difflib`](https://python-all.ru/3.2/library/difflib.html#module-difflib).1415Модуль [`filecmp`](https://python-all.ru/3.2/library/filecmp.html#module-filecmp) определяет следующие функции:1617#### `filecmp.cmp(f1, f2, shallow=True)`1819Сравнивает файлы с именами *f1* и *f2*, возвращая `True`, если они кажутся равными, иначе `False`.2021Если *shallow* не задан или равен False, файлы с одинаковыми сигнатурами [`os.stat()`](https://python-all.ru/3.2/library/os.html#os.stat) считаются равными.2223Файлы, уже сравнённые с помощью этой функции, не будут сравниваться повторно, пока не изменится их сигнатура [`os.stat()`](https://python-all.ru/3.2/library/os.html#os.stat).2425Обратите внимание, что эта функция не вызывает внешние программы, что обеспечивает её переносимость и эффективность.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.2/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Пример:3839```python40>>> import filecmp41>>> filecmp.cmp('undoc.rst', 'undoc.rst') 42True43>>> filecmp.cmp('undoc.rst', 'index.rst') 44False45```4647## 10.4.1. Класс [`dircmp`](https://python-all.ru/3.2/library/filecmp.html#filecmp.dircmp)4849Экземпляры [`dircmp`](https://python-all.ru/3.2/library/filecmp.html#filecmp.dircmp) создаются с помощью этого конструктора:5051#### `class filecmp.dircmp(a, b, ignore=None, hide=None)`5253Создаёт новый объект сравнения каталогов для сравнения каталогов *a* и *b*. *ignore* – это список имён для игнорирования; по умолчанию равен `['RCS', 'CVS', 'tags']`. *hide* – это список имён для скрытия; по умолчанию равен `[os.curdir, os.pardir]`.5455Класс [`dircmp`](https://python-all.ru/3.2/library/filecmp.html#filecmp.dircmp) сравнивает файлы, выполняя *shallow* сравнения, как описано для [`filecmp.cmp()`](https://python-all.ru/3.2/library/filecmp.html#filecmp.cmp).5657Класс [`dircmp`](https://python-all.ru/3.2/library/filecmp.html#filecmp.dircmp) предоставляет следующие методы:5859#### `report()`6061Выводит (в `sys.stdout`) результат сравнения между *a* и *b*.6263#### `report_partial_closure()`6465Выводит результат сравнения между *a* и *b* и общими непосредственными подкаталогами.6667#### `report_full_closure()`6869Выводит результат сравнения между *a* и *b* и общими подкаталогами (рекурсивно).7071Класс [`dircmp`](https://python-all.ru/3.2/library/filecmp.html#filecmp.dircmp) предоставляет ряд полезных атрибутов, которые могут быть использованы для получения различной информации о сравниваемых деревьях каталогов.7273Обратите внимание, что через перехватчики [`__getattr__()`](https://python-all.ru/3.2/reference/datamodel.html#object.__getattr__) все атрибуты вычисляются лениво, поэтому нет потери производительности, если используются только те атрибуты, которые легко вычислить.7475#### `left`7677Каталог *a*.7879#### `right`8081Каталог *b*.8283#### `left_list`8485Файлы и подкаталоги в *a*, отфильтрованные по *hide* и *ignore*.8687#### `right_list`8889Файлы и подкаталоги в *b*, отфильтрованные по *hide* и *ignore*.9091#### `common`9293Файлы и подкаталоги, присутствующие в обоих *a* и *b*.9495#### `left_only`9697Файлы и подкаталоги только в *a*.9899#### `right_only`100101Файлы и подкаталоги только в *b*.102103#### `common_dirs`104105Подкаталоги, присутствующие в обоих *a* и *b*.106107#### `common_files`108109Файлы, присутствующие в обоих *a* и *b*110111#### `common_funny`112113Имена, присутствующие как в *a*, так и в *b*, для которых тип различается между dиректориями, или имена, для которых [`os.stat()`](https://python-all.ru/3.2/library/os.html#os.stat) сообщает об ошибке.114115#### `same_files`116117Файлы, которые идентичны в обоих *a* и *b*, с использованием оператора сравнения файлов класса.118119#### `diff_files`120121Файлы, присутствующие в обоих *a* и *b*, содержимое которых различается согласно оператору сравнения файлов класса.122123#### `funny_files`124125Файлы, присутствующие в обоих *a* и *b*, но которые не удалось сравнить.126127#### `subdirs`128129Словарь, сопоставляющий имена из [`common_dirs`](https://python-all.ru/3.2/library/filecmp.html#filecmp.dircmp.common_dirs) объектам [`dircmp`](https://python-all.ru/3.2/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