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

shutil.md

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

1> **Источник:** https://python-all.ru/3.3/library/shutil.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 11.9. [`shutil`](https://python-all.ru/3.3/library/shutil.html#module-shutil) – высокоуровневые операции с файлами89**Исходный код:** [Lib/shutil.py](https://python-all.ru/src/3.3/Lib/shutil.py)1011---1213Модуль [`shutil`](https://python-all.ru/3.3/library/shutil.html#module-shutil) предоставляет ряд высокоуровневых операций над файлами и коллекциями файлов. В частности, предоставляются функции для копирования и удаления файлов. Для операций над отдельными файлами смотрите также модуль [`os`](https://python-all.ru/3.3/library/os.html#module-os).1415> **Предупреждение**16>17> Даже более высокоуровневые функции копирования файлов ([`shutil.copy()`](https://python-all.ru/3.3/library/shutil.html#shutil.copy), [`shutil.copy2()`](https://python-all.ru/3.3/library/shutil.html#shutil.copy2)) не могут скопировать все метаданные файла.18>19> На платформах POSIX это означает, что владелец и группа файла теряются, а также ACL. На Mac OS не используются ресурсные форки и другие метаданные. Это означает, что ресурсы будут потеряны, а коды типа и создателя файла будут некорректными. В Windows владельцы файлов, ACL и альтернативные потоки данных не копируются.2021## 11.9.1. Операции с каталогами и файлами2223#### `shutil.copyfileobj(fsrc, fdst[, length])`2425Копирует содержимое файлоподобного объекта *fsrc* в файлоподобный объект *fdst*. Целое число *length*, если задано, определяет размер буфера. В частности, отрицательное значение *length* означает копирование данных без разбиения исходных данных на части; по умолчанию данные читаются порциями, чтобы избежать неконтролируемого расхода памяти. Обратите внимание: если текущая позиция в файле объекта *fsrc* не равна 0, будут скопированы только данные от текущей позиции до конца файла.2627#### `shutil.copyfile(src, dst, *, follow_symlinks=True)`2829Копирует содержимое (без метаданных) файла с именем *src* в файл с именем *dst* и возвращает *dst*. *src* и *dst* – это пути в виде строк. *dst* должен быть полным именем целевого файла; для копирования, принимающего целевой каталог, см. [`shutil.copy()`](https://python-all.ru/3.3/library/shutil.html#shutil.copy). Если *src* и *dst* ссылаются на один и тот же файл, возбуждается [`Error`](https://python-all.ru/3.3/library/shutil.html#shutil.Error).3031Целевой каталог должен быть доступен для записи; в противном случае будет возбуждено исключение [`OSError`](https://python-all.ru/3.3/library/exceptions.html#OSError). Если *dst* уже существует, он будет заменён. Специальные файлы, такие как символьные или блочные устройства и каналы, не могут быть скопированы этой функцией.3233Если *follow\_symlinks* имеет значение false и *src* является символической ссылкой, будет создана новая символическая ссылка вместо копирования файла, на который указывает *src*.3435Изменено в версии 3.3: Раньше возбуждалось [`IOError`](https://python-all.ru/3.3/library/exceptions.html#IOError) вместо [`OSError`](https://python-all.ru/3.3/library/exceptions.html#OSError). Добавлен аргумент *follow\_symlinks*. Теперь возвращает *dst*.3637#### `shutil.copymode(src, dst, *, follow_symlinks=True)`3839Копирует биты прав доступа из *src* в *dst*. Содержимое файла, владелец и группа не изменяются. *src* и *dst* – это пути, заданные строками. Если *follow\_symlinks* равно false и оба *src* и *dst* являются символическими ссылками, [`copymode()`](https://python-all.ru/3.3/library/shutil.html#shutil.copymode) попытается изменить режим самой *dst* (а не файла, на который она указывает). Эта функциональность доступна не на всех платформах; пожалуйста, обратитесь к [`copystat()`](https://python-all.ru/3.3/library/shutil.html#shutil.copystat) для получения дополнительной информации. Если [`copymode()`](https://python-all.ru/3.3/library/shutil.html#shutil.copymode) не может модифицировать символические ссылки на данной платформе, и её просят это сделать, она ничего не делает и возвращается.4041Изменено в версии 3.3: Добавлен аргумент *follow\_symlinks*.4243#### `shutil.copystat(src, dst, *, follow_symlinks=True)`4445Копирует биты прав доступа, время последнего доступа, время последнего изменения и флаги из *src* в *dst*. На Linux [`copystat()`](https://python-all.ru/3.3/library/shutil.html#shutil.copystat) также копирует «расширенные атрибуты», если это возможно. Содержимое файла, владелец и группа не изменяются. *src* и *dst* – это пути, заданные строками.4647Если *follow\_symlinks* равно false и *src* и *dst* обе являются символическими ссылками, [`copystat()`](https://python-all.ru/3.3/library/shutil.html#shutil.copystat) будет работать с самими символическими ссылками, а не с файлами, на которые они указывают – читая информацию из символической ссылки *src* и записывая информацию в символическую ссылку *dst*.4849> **Примечание**50>51> Не все платформы предоставляют возможность просматривать и изменять символические ссылки. Python сам может сообщить, какая функциональность доступна локально.52>53> - Если `os.chmod in os.supports_follow_symlinks` равно `True`, [`copystat()`](https://python-all.ru/3.3/library/shutil.html#shutil.copystat) может изменять биты прав доступа символической ссылки.54> - Если `os.utime in os.supports_follow_symlinks` равно `True`, [`copystat()`](https://python-all.ru/3.3/library/shutil.html#shutil.copystat) может изменять время последнего доступа и время последнего изменения символической ссылки.55> - Если `os.chflags in os.supports_follow_symlinks` равно `True`, [`copystat()`](https://python-all.ru/3.3/library/shutil.html#shutil.copystat) может изменять флаги символической ссылки. (`os.chflags` доступна не на всех платформах.)56>57> На платформах, где часть или вся эта функциональность недоступна, при запросе на модификацию символической ссылки [`copystat()`](https://python-all.ru/3.3/library/shutil.html#shutil.copystat) скопирует всё, что сможет. [`copystat()`](https://python-all.ru/3.3/library/shutil.html#shutil.copystat) никогда не возвращает ошибку.58>59> Пожалуйста, обратитесь к [`os.supports_follow_symlinks`](https://python-all.ru/3.3/library/os.html#os.supports_follow_symlinks) для получения дополнительной информации.6061Изменено в версии 3.3: Добавлен аргумент *follow\_symlinks* и поддержка расширенных атрибутов Linux.6263#### `shutil.copy(src, dst, *, follow_symlinks=True)`6465Копирует файл *src* в файл или каталог *dst*. *src* и *dst* должны быть строками. Если *dst* указывает на каталог, файл будет скопирован в *dst* с использованием базового имени из *src*. Возвращает путь к только что созданному файлу.6667Если *follow\_symlinks* имеет значение false и *src* является символической ссылкой, *dst* будет создан как символическая ссылка. Если *follow\_symlinks* имеет значение true и *src* является символической ссылкой, *dst* будет копией файла, на который указывает *src*.6869[`copy()`](https://python-all.ru/3.3/library/copy.html#module-copy) копирует данные файла и режим прав доступа к файлу (см. [`os.chmod()`](https://python-all.ru/3.3/library/os.html#os.chmod)). Другие метаданные, такие как время создания и модификации файла, не сохраняются. Чтобы сохранить все метаданные из оригинала, используйте вместо этого [`copy2()`](https://python-all.ru/3.3/library/shutil.html#shutil.copy2).7071Изменено в версии 3.3: Добавлен аргумент *follow\_symlinks*. Теперь возвращает путь к созданному файлу.7273#### `shutil.copy2(src, dst, *, follow_symlinks=True)`7475Идентична [`copy()`](https://python-all.ru/3.3/library/shutil.html#shutil.copy), за исключением того, что [`copy2()`](https://python-all.ru/3.3/library/shutil.html#shutil.copy2) также пытается сохранить все метаданные файла.7677Когда *follow\_symlinks* равно false и *src* является символической ссылкой, [`copy2()`](https://python-all.ru/3.3/library/shutil.html#shutil.copy2) пытается скопировать все метаданные из символической ссылки *src* в только что созданную символическую ссылку *dst*. Однако эта функциональность доступна не на всех платформах. На платформах, где часть или вся эта функциональность недоступна, [`copy2()`](https://python-all.ru/3.3/library/shutil.html#shutil.copy2) сохранит все метаданные, которые сможет; [`copy2()`](https://python-all.ru/3.3/library/shutil.html#shutil.copy2) никогда не возвращает ошибку.7879[`copy2()`](https://python-all.ru/3.3/library/shutil.html#shutil.copy2) использует [`copystat()`](https://python-all.ru/3.3/library/shutil.html#shutil.copystat) для копирования метаданных файла. Пожалуйста, обратитесь к [`copystat()`](https://python-all.ru/3.3/library/shutil.html#shutil.copystat) для получения дополнительной информации о поддержке платформой модификации метаданных символической ссылки.8081Изменено в версии 3.3: Добавлен аргумент *follow\_symlinks*, также предпринята попытка копировать расширенные атрибуты файловой системы (пока только Linux). Теперь возвращает путь к созданному файлу.8283#### `shutil.ignore_patterns(*patterns)`8485Эта фабричная функция создаёт функцию, которую можно использовать в качестве вызываемого объекта для [`copytree()`](https://python-all.ru/3.3/library/shutil.html#shutil.copytree) аргумента *ignore*, игнорируя файлы и каталоги, соответствующие одному из предоставленных шаблонов в стиле glob *patterns*. Смотрите пример ниже.8687#### `shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False)`8889Рекурсивно копирует всё дерево каталогов с корнем в *src*, возвращая целевой каталог. Целевой каталог, заданный *dst*, не должен уже существовать; он будет создан вместе с отсутствующими родительскими каталогами. Права доступа и временные метки каталогов копируются с помощью [`copystat()`](https://python-all.ru/3.3/library/shutil.html#shutil.copystat), отдельные файлы копируются с помощью [`shutil.copy2()`](https://python-all.ru/3.3/library/shutil.html#shutil.copy2).9091Если *symlinks* имеет значение true, символические ссылки в исходном дереве представляются как символические ссылки в новом дереве, и метаданные исходных ссылок будут скопированы насколько это позволяет платформа; если false или аргумент опущен, содержимое и метаданные файлов, на которые указывают ссылки, копируются в новое дерево.9293Когда *symlinks* равен False, если файл, на который указывает симлинк, не существует, исключение будет добавлено в список ошибок, возбуждаемых в исключении [`Error`](https://python-all.ru/3.3/library/shutil.html#shutil.Error) в конце процесса копирования. Можно установить необязательный флаг *ignore\_dangling\_symlinks* в значение True, чтобы подавить это исключение. Обратите внимание, что эта опция не действует на платформах, не поддерживающих [`os.symlink()`](https://python-all.ru/3.3/library/os.html#os.symlink).9495Если задан *ignore*, он должен быть вызываемым объектом, который будет получать в качестве аргументов каталог, посещаемый функцией [`copytree()`](https://python-all.ru/3.3/library/shutil.html#shutil.copytree), и список его содержимого, возвращаемый функцией [`os.listdir()`](https://python-all.ru/3.3/library/os.html#os.listdir). Поскольку [`copytree()`](https://python-all.ru/3.3/library/shutil.html#shutil.copytree) вызывается рекурсивно, вызываемый объект *ignore* будет вызываться один раз для каждого копируемого каталога. Вызываемый объект должен возвращать последовательность имён каталогов и файлов относительно текущего каталога (т.е. подмножество элементов своего второго аргумента); эти имена затем будут игнорироваться в процессе копирования. [`ignore_patterns()`](https://python-all.ru/3.3/library/shutil.html#shutil.ignore_patterns) можно использовать для создания такого вызываемого объекта, который игнорирует имена на основе шаблонов в стиле glob.9697Если возникнут исключения, возбуждается исключение [`Error`](https://python-all.ru/3.3/library/shutil.html#shutil.Error) со списком причин.9899Если задан *copy\_function*, он должен быть вызываемым объектом, который будет использоваться для копирования каждого файла. Он будет вызван с исходным и целевым путями в качестве аргументов. По умолчанию используется [`shutil.copy2()`](https://python-all.ru/3.3/library/shutil.html#shutil.copy2), но может использоваться любая функция, поддерживающая ту же сигнатуру (например, [`shutil.copy()`](https://python-all.ru/3.3/library/shutil.html#shutil.copy)).100101Изменено в версии 3.3: Копирует метаданные, когда *symlinks* имеет значение false. Теперь возвращает *dst*.102103Изменено в версии 3.2: Добавлен аргумент *copy\_function*, позволяющий указать собственную функцию копирования. Добавлен аргумент *ignore\_dangling\_symlinks* для подавления ошибок оборванных символических ссылок, когда *symlinks* имеет значение false.104105#### `shutil.rmtree(path, ignore_errors=False, onerror=None)`106107Удаляет целое дерево каталогов; *path* должен указывать на каталог (но не на символическую ссылку на каталог). Если *ignore\_errors* равен true, ошибки, возникающие при неудачном удалении, игнорируются; если false или не указан, такие ошибки обрабатываются вызовом обработчика, заданного *onerror*, или, если он не указан, вызывается исключение.108109> **Примечание**110>111> На платформах, поддерживающих необходимые функции, основанные на файловых дескрипторах, по умолчанию используется устойчивая к символьным ссылкам версия [`rmtree()`](https://python-all.ru/3.3/library/shutil.html#shutil.rmtree). На других платформах реализация [`rmtree()`](https://python-all.ru/3.3/library/shutil.html#shutil.rmtree) подвержена атаке через символьные ссылки: при правильном выборе времени и обстоятельств злоумышленники могут манипулировать символьными ссылками в файловой системе, чтобы удалить файлы, к которым иначе они не могли бы получить доступ. Приложения могут использовать атрибут функции [`rmtree.avoids_symlink_attacks`](https://python-all.ru/3.3/library/shutil.html#shutil.rmtree.avoids_symlink_attacks), чтобы определить, какой случай применим.112113Если *onerror* задан, он должен быть вызываемым объектом, принимающим три параметра: *function*, *path* и *excinfo*.114115Первый параметр, *function*, – это функция, вызвавшая исключение; он зависит от платформы и реализации. Второй параметр, *path*, – это имя пути, переданное функции *function*. Третий параметр, *excinfo*, – это информация об исключении, возвращаемая функцией [`sys.exc_info()`](https://python-all.ru/3.3/library/sys.html#sys.exc_info). Исключения, возбуждённые внутри *onerror*, перехвачены не будут.116117Изменено в версии 3.3: Добавлена версия, устойчивая к атакам через символические ссылки, которая используется автоматически, если платформа поддерживает функции на основе файловых дескрипторов.118119#### `rmtree.avoids_symlink_attacks`120121Указывает, предоставляют ли текущая платформа и реализация устойчивую к символьным ссылкам версию [`rmtree()`](https://python-all.ru/3.3/library/shutil.html#shutil.rmtree). В настоящее время это верно только для платформ, поддерживающих функции доступа к каталогам на основе файловых дескрипторов.122123Новое в версии 3.3.124125#### `shutil.move(src, dst)`126127Рекурсивно перемещает файл или каталог (*src*) в другое место (*dst*) и возвращает путь назначения.128129Если назначение является каталогом или симлинком на каталог, то *src* перемещается внутрь этого каталога.130131Целевой каталог не должен уже существовать. Если целевой путь уже существует, но не является каталогом, он может быть перезаписан в зависимости от семантики [`os.rename()`](https://python-all.ru/3.3/library/os.html#os.rename).132133Если целевой объект находится в текущей файловой системе, используется [`os.rename()`](https://python-all.ru/3.3/library/os.html#os.rename). В противном случае *src* копируется (с помощью [`shutil.copy2()`](https://python-all.ru/3.3/library/shutil.html#shutil.copy2)) в *dst*, а затем удаляется. В случае символьных ссылок будет создана новая символьная ссылка, указывающая на цель *src*, в или как *dst*, и *src* будет удалена.134135Изменено в версии 3.3: Добавлена явная обработка символических ссылок для внешних файловых систем, что адаптирует поведение к GNU **mv**. Теперь возвращает *dst*.136137#### `shutil.disk_usage(path)`138139Возвращает статистику использования диска для указанного пути в виде [*именованного кортежа*](https://python-all.ru/3.3/glossary.html#term-named-tuple) с атрибутами *total*, *used* и *free*, которые содержат общий, используемый и свободный объём в байтах.140141Новое в версии 3.3.142143Доступность: Unix, Windows.144145#### `shutil.chown(path, user=None, group=None)`146147Изменяет владельца *user* и/или группу *group* для указанного *path*.148149*user* может быть системным именем пользователя или uid; то же самое относится к *group*. Требуется хотя бы один аргумент.150151См. также [`os.chown()`](https://python-all.ru/3.3/library/os.html#os.chown) – нижележащую функцию.152153Доступность: Unix.154155Новое в версии 3.3.156157#### `shutil.which(cmd, mode=os.F_OK | os.X_OK, path=None)`158159Возвращает путь к исполняемому файлу, который был бы запущен, если бы была вызвана указанная *cmd*. Если ни одна *cmd* не будет вызвана, возвращает `None`.160161*mode* – это маска прав доступа, передаваемая в [`os.access()`](https://python-all.ru/3.3/library/os.html#os.access); по умолчанию определяет, существует ли файл и является ли он исполняемым.162163Если *path* не указан, используются результаты [`os.environ()`](https://python-all.ru/3.3/library/os.html#os.environ), возвращающие либо значение «PATH», либо резервное значение [`os.defpath`](https://python-all.ru/3.3/library/os.html#os.defpath).164165В Windows текущий каталог всегда добавляется в начало *path*, независимо от того, используется ли значение по умолчанию или указано своё – это поведение командной оболочки при поиске исполняемых файлов. Кроме того, при поиске *cmd* в *path* проверяется переменная окружения `PATHEXT`. Например, при вызове `shutil.which("python")`, [`which()`](https://python-all.ru/3.3/library/shutil.html#shutil.which) будет искать в `PATHEXT`, чтобы узнать, что нужно искать `python.exe` в каталогах *path*. Например, в Windows:166167```python168>>> shutil.which("python")169'C:\\Python33\\python.EXE'170```171172Новое в версии 3.3.173174#### `exception shutil.Error`175176Это исключение собирает исключения, возбуждённые во время операции с несколькими файлами. Для [`copytree()`](https://python-all.ru/3.3/library/shutil.html#shutil.copytree) аргумент исключения представляет собой список трёхэлементных кортежей (*srcname*, *dstname*, *исключение*).177178### 11.9.1.1. Пример copytree179180Этот пример является реализацией функции [`copytree()`](https://python-all.ru/3.3/library/shutil.html#shutil.copytree), описанной выше, с опущенной строкой документации. Он демонстрирует многие другие функции, предоставляемые этим модулем.181182```python183def copytree(src, dst, symlinks=False):184    names = os.listdir(src)185    os.makedirs(dst)186    errors = []187    for name in names:188        srcname = os.path.join(src, name)189        dstname = os.path.join(dst, name)190        try:191            if symlinks and os.path.islink(srcname):192                linkto = os.readlink(srcname)193                os.symlink(linkto, dstname)194            elif os.path.isdir(srcname):195                copytree(srcname, dstname, symlinks)196            else:197                copy2(srcname, dstname)198            # XXX Что насчет устройств, сокетов и т.д.?199        except OSError as why:200            errors.append((srcname, dstname, str(why)))201        # перехватываем ошибку от рекурсивного copytree, чтобы мы могли202        # продолжить с другими файлами203        except Error as err:204            errors.extend(err.args[0])205    try:206        copystat(src, dst)207    except WindowsError:208        # не удается скопировать время доступа к файлам в Windows209        pass210    except OSError as why:211        errors.extend((src, dst, str(why)))212    if errors:213        raise Error(errors)214```215216Другой пример, использующий вспомогательную функцию [`ignore_patterns()`](https://python-all.ru/3.3/library/shutil.html#shutil.ignore_patterns):217218```python219from shutil import copytree, ignore_patterns220221copytree(source, destination, ignore=ignore_patterns('*.pyc', 'tmp*'))222```223224Это скопирует все, кроме файлов `.pyc` и файлов или каталогов, имя которых начинается с `tmp`.225226Ещё один пример, использующий аргумент *ignore* для добавления вызова журналирования:227228```python229from shutil import copytree230import logging231232def _logpath(path, names):233    logging.info('Working in %s' % path)234    return []   # ничего не будет проигнорировано235236copytree(source, destination, ignore=_logpath)237```238239## 11.9.2. Операции архивирования240241Новое в версии 3.2.242243Также предоставляются высокоуровневые утилиты для создания и чтения сжатых и архивных файлов. Они полагаются на модули [`zipfile`](https://python-all.ru/3.3/library/zipfile.html#module-zipfile) и [`tarfile`](https://python-all.ru/3.3/library/tarfile.html#module-tarfile).244245#### `shutil.make_archive(base_name, format[, root_dir[, base_dir[, verbose[, dry_run[, owner[, group[, logger]]]]]]])`246247Создаёт архивный файл (например, zip или tar) и возвращает его имя.248249*base\_name* – это имя создаваемого файла, включая путь, без расширения, специфичного для формата. *format* – это формат архива: один из «zip», «tar», «bztar» (если доступен модуль [`bz2`](https://python-all.ru/3.3/library/bz2.html#module-bz2)) или «gztar».250251*root\_dir* – это каталог, который будет корневым каталогом архива; например, мы обычно переходим в *root\_dir* перед созданием архива.252253*base\_dir* – это каталог, из которого начинается архивирование; т.е. *base\_dir* будет общим префиксом всех файлов и каталогов в архиве.254255*root\_dir* и *base\_dir* по умолчанию равны текущему каталогу.256257*owner* и *group* используются при создании tar-архива. По умолчанию используются текущий владелец и группа.258259*logger* должен быть объектом, совместимым с [**PEP 282**](https://python-all.ru/3.3/library/shutil.html), обычно экземпляром [`logging.Logger`](https://python-all.ru/3.3/library/logging.html#logging.Logger).260261#### `shutil.get_archive_formats()`262263Возвращает список поддерживаемых форматов архивирования. Каждый элемент возвращаемой последовательности – кортеж `(name, description)`264265По умолчанию [`shutil`](https://python-all.ru/3.3/library/shutil.html#module-shutil) предоставляет следующие форматы:266267- *gztar*: tar-файл, сжатый gzip268- *bztar*: tar-файл, сжатый bzip2 (если доступен модуль [`bz2`](https://python-all.ru/3.3/library/bz2.html#module-bz2)).269- *tar*: несжатый tar-файл270- *zip*: ZIP-файл271272Можно зарегистрировать новые форматы или предоставить собственный архиватор для любых существующих форматов, используя [`register_archive_format()`](https://python-all.ru/3.3/library/shutil.html#shutil.register_archive_format).273274#### `shutil.register_archive_format(name, function[, extra_args[, description]])`275276Регистрирует архиватор для формата *name*. *function* – это вызываемый объект, который будет использоваться для вызова архиватора.277278Если задано, *extra\_args* – это последовательность пар `(name, value)`, которые будут использоваться как дополнительные именованные аргументы при вызове архиватора.279280*description* используется функцией [`get_archive_formats()`](https://python-all.ru/3.3/library/shutil.html#shutil.get_archive_formats), которая возвращает список архиваторов. По умолчанию – пустой список.281282#### `shutil.unregister_archive_format(name)`283284Удалите имя формата архива *name* из списка поддерживаемых форматов.285286#### `shutil.unpack_archive(filename[, extract_dir[, format]])`287288Распаковывает архив. *filename* – это полный путь к архиву.289290*extract\_dir* – имя целевой директории, в которую распаковывается архив. Если не указано, используется текущая рабочая директория.291292*format* – это формат архива: один из «zip», «tar» или «gztar». Или любой другой формат, зарегистрированный с помощью [`register_unpack_format()`](https://python-all.ru/3.3/library/shutil.html#shutil.register_unpack_format). Если не указан, [`unpack_archive()`](https://python-all.ru/3.3/library/shutil.html#shutil.unpack_archive) использует расширение имени файла архива и проверяет, зарегистрирован ли распаковщик для этого расширения. Если ни один не найден, возбуждается [`ValueError`](https://python-all.ru/3.3/library/exceptions.html#ValueError).293294#### `shutil.register_unpack_format(name, extensions, function[, extra_args[, description]])`295296Регистрирует формат распаковки. *name* – это имя формата, а *extensions* – список расширений, соответствующих формату, например `.zip` для Zip-файлов.297298*function* – это вызываемый объект, который будет использоваться для распаковки архивов. Вызываемый объект будет получать путь к архиву, за которым следует каталог, в который необходимо извлечь архив.299300Если указано, *extra\_args* – это последовательность кортежей `(name, value)`, которые будут переданы как именованные аргументы вызываемому объекту.301302*description* может быть указан для описания формата и будет возвращён функцией [`get_unpack_formats()`](https://python-all.ru/3.3/library/shutil.html#shutil.get_unpack_formats).303304#### `shutil.unregister_unpack_format(name)`305306Отменяет регистрацию формата распаковки. *name* – имя формата.307308#### `shutil.get_unpack_formats()`309310Возвращает список всех зарегистрированных форматов распаковки. Каждый элемент возвращаемой последовательности – это кортеж `(name, extensions, description)`.311312По умолчанию [`shutil`](https://python-all.ru/3.3/library/shutil.html#module-shutil) предоставляет следующие форматы:313314- *gztar*: tar-файл, сжатый gzip315- *bztar*: tar-файл, сжатый bzip2 (если доступен модуль [`bz2`](https://python-all.ru/3.3/library/bz2.html#module-bz2)).316- *tar*: несжатый tar-файл317- *zip*: ZIP-файл318319Можно зарегистрировать новые форматы или предоставить собственный распаковщик для любых существующих форматов, используя [`register_unpack_format()`](https://python-all.ru/3.3/library/shutil.html#shutil.register_unpack_format).320321### 11.9.2.1. Пример архивации322323В этом примере создаётся tar-архив, сжатый gzip, содержащий все файлы, найденные в каталоге пользователя `.ssh`:324325```python326>>> from shutil import make_archive327>>> import os328>>> archive_name = os.path.expanduser(os.path.join('~', 'myarchive'))329>>> root_dir = os.path.expanduser(os.path.join('~', '.ssh'))330>>> make_archive(archive_name, 'gztar', root_dir)331'/Users/tarek/myarchive.tar.gz'332```333334Полученный архив содержит:335336```python337$ tar -tzvf /Users/tarek/myarchive.tar.gz338drwx------ tarek/staff       0 2010-02-01 16:23:40 ./339-rw-r--r-- tarek/staff     609 2008-06-09 13:26:54 ./authorized_keys340-rwxr-xr-x tarek/staff      65 2008-06-09 13:26:54 ./config341-rwx------ tarek/staff     668 2008-06-09 13:26:54 ./id_dsa342-rwxr-xr-x tarek/staff     609 2008-06-09 13:26:54 ./id_dsa.pub343-rw------- tarek/staff    1675 2008-06-09 13:26:54 ./id_rsa344-rw-r--r-- tarek/staff     397 2008-06-09 13:26:54 ./id_rsa.pub345-rw-r--r-- tarek/staff   37192 2010-02-06 18:23:10 ./known_hosts346```347348## 11.9.3. Определение размера выходного терминала349350Новое в версии 3.3.351352#### `shutil.get_terminal_size(fallback=(columns, lines))`353354Получить размер окна терминала.355356Для каждого из двух измерений проверяется соответствующая переменная окружения: `COLUMNS` и `LINES`. Если переменная определена и её значение – положительное целое число, оно используется.357358Если `COLUMNS` или `LINES` не определены (что бывает чаще всего), запрашивается терминал, подключённый к [`sys.__stdout__`](https://python-all.ru/3.3/library/sys.html#sys.__stdout__), путём вызова [`os.get_terminal_size()`](https://python-all.ru/3.3/library/os.html#os.get_terminal_size).359360Если размер терминала не удаётся получить – либо из-за того, что система не поддерживает запрос, либо потому, что нет подключения к терминалу, – используется значение, указанное в параметре `fallback`. `fallback` по умолчанию равен `(80, 24)`, что является размером, используемым по умолчанию во многих эмуляторах терминала.361362Возвращаемое значение – именованный кортеж типа [`os.terminal_size`](https://python-all.ru/3.3/library/os.html#os.terminal_size).363364См. также: The Single UNIX Specification, Version 2, [Другие переменные окружения](https://python-all.ru/3.3/library/shutil.html).365