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

filecmp.md

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

1> **Источник:** https://python-all.ru/2.7/library/filecmp.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 10.5. [`filecmp`](https://python-all.ru/2.7/library/filecmp.html#module-filecmp) – сравнение файлов и каталогов89**Исходный код:** [Lib/filecmp.py](https://python-all.ru/src/2.7/Lib/filecmp.py)1011---1213Модуль [`filecmp`](https://python-all.ru/2.7/library/filecmp.html#module-filecmp) определяет функции для сравнения файлов и каталогов с различными опциональными компромиссами между скоростью и точностью. Для сравнения файлов см. также модуль [`difflib`](https://python-all.ru/2.7/library/difflib.html#module-difflib).1415Модуль [`filecmp`](https://python-all.ru/2.7/library/filecmp.html#module-filecmp) определяет следующие функции:1617#### `filecmp.cmp(f1, f2[, shallow])`1819Сравнивает файлы с именами *f1* и *f2*, возвращая `True`, если они кажутся равными, `False` в противном случае.2021Если *shallow* не задан или равен истине, файлы с одинаковыми [`os.stat()`](https://python-all.ru/2.7/library/os.html#os.stat) сигнатурами считаются равными.2223Файлы, которые уже сравнивались с помощью этой функции, не будут сравниваться повторно, если не изменится их [`os.stat()`](https://python-all.ru/2.7/library/os.html#os.stat) сигнатура.2425Обратите внимание, что эта функция не вызывает внешние программы, что обеспечивает её переносимость и эффективность.2627#### `filecmp.cmpfiles(dir1, dir2, common[, shallow])`2829Сравнивает файлы в двух каталогах *dir1* и *dir2*, чьи имена указаны в *common*.3031Возвращает три списка имён файлов: *match*, *mismatch*, *errors*. *match* содержит список совпадающих файлов, *mismatch* содержит имена тех, которые не совпадают, а *errors* перечисляет имена файлов, которые не удалось сравнить. Файлы попадают в *errors*, если они отсутствуют в одном из каталогов, у пользователя нет прав на их чтение или сравнение не удалось выполнить по другой причине.3233Параметр *shallow* имеет тот же смысл и значение по умолчанию, что и для [`filecmp.cmp()`](https://python-all.ru/2.7/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.5.1. Класс [`dircmp`](https://python-all.ru/2.7/library/filecmp.html#filecmp.dircmp)4849Экземпляры [`dircmp`](https://python-all.ru/2.7/library/filecmp.html#filecmp.dircmp) создаются с помощью этого конструктора:5051#### `class filecmp.dircmp(a, b[, ignore[, hide]])`5253Создаёт новый объект сравнения каталогов для сравнения каталогов *a* и *b*. Параметр *ignore* – это список имён, которые следует игнорировать; по умолчанию `['RCS', 'CVS', 'tags']`. Параметр *hide* – список имён для скрытия; по умолчанию `[os.curdir, os.pardir]`.5455Класс [`dircmp`](https://python-all.ru/2.7/library/filecmp.html#filecmp.dircmp) сравнивает файлы, выполняя *поверхностное* сравнение, как описано для [`filecmp.cmp()`](https://python-all.ru/2.7/library/filecmp.html#filecmp.cmp).5657Класс [`dircmp`](https://python-all.ru/2.7/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/2.7/library/filecmp.html#filecmp.dircmp) предоставляет ряд интересных атрибутов, которые могут быть использованы для получения различной информации о сравниваемых деревьях каталогов.7273Обратите внимание, что благодаря [`__getattr__()`](https://python-all.ru/2.7/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*, для которых тип отличается между каталогами, или имена, для которых [`os.stat()`](https://python-all.ru/2.7/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/2.7/library/filecmp.html#filecmp.dircmp.common_dirs) в объекты [`dircmp`](https://python-all.ru/2.7/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