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

shutil.md

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

1> **Источник:** https://python-all.ru/3.4/library/shutil.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 11.10. [`shutil`](https://python-all.ru/3.4/library/shutil.html#module-shutil) – Высокоуровневые операции с файлами89**Исходный код:** [Lib/shutil.py](https://python-all.ru/src/3.4/Lib/shutil.py)1011---1213Модуль [`shutil`](https://python-all.ru/3.4/library/shutil.html#module-shutil) предоставляет ряд высокоуровневых операций над файлами и коллекциями файлов. В частности, предоставляются функции для копирования и удаления файлов. Для операций над отдельными файлами смотрите также модуль [`os`](https://python-all.ru/3.4/library/os.html#module-os).1415> **Предупреждение**16>17> Даже более высокоуровневые функции копирования файлов ([`shutil.copy()`](https://python-all.ru/3.4/library/shutil.html#shutil.copy), [`shutil.copy2()`](https://python-all.ru/3.4/library/shutil.html#shutil.copy2)) не могут скопировать все метаданные файла.18>19> На платформах POSIX это означает, что владелец и группа файла теряются, а также ACL. На Mac OS не используются ресурсные форки и другие метаданные. Это означает, что ресурсы будут потеряны, а коды типа и создателя файла будут некорректными. В Windows владельцы файлов, ACL и альтернативные потоки данных не копируются.2021## 11.10.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.4/library/shutil.html#shutil.copy) для версии, которая принимает путь к целевой директории. Если *src* и *dst* указывают на один и тот же файл, возбуждается [`SameFileError`](https://python-all.ru/3.4/library/shutil.html#shutil.SameFileError).3031Целевой каталог должен быть доступен для записи; в противном случае будет возбуждено исключение [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError). Если *dst* уже существует, он будет заменён. Специальные файлы, такие как символьные или блочные устройства и каналы, не могут быть скопированы этой функцией.3233Если *follow\_symlinks* имеет значение false и *src* является символической ссылкой, будет создана новая символическая ссылка вместо копирования файла, на который указывает *src*.3435Изменено в версии 3.3: Раньше возбуждалось [`IOError`](https://python-all.ru/3.4/library/exceptions.html#IOError) вместо [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError). Добавлен аргумент *follow\_symlinks*. Теперь возвращает *dst*.3637Изменено в версии 3.4: Возбуждается [`SameFileError`](https://python-all.ru/3.4/library/shutil.html#shutil.SameFileError) вместо [`Error`](https://python-all.ru/3.4/library/shutil.html#shutil.Error). Поскольку первое является подклассом второго, это изменение обратно совместимо.3839#### `exception shutil.SameFileError`4041Это исключение возбуждается, если источник и назначение в [`copyfile()`](https://python-all.ru/3.4/library/shutil.html#shutil.copyfile) являются одним и тем же файлом.4243Новое в версии 3.4.4445#### `shutil.copymode(src, dst, *, follow_symlinks=True)`4647Копирует биты прав доступа из *src* в *dst*. Содержимое файла, владелец и группа не изменяются. *src* и *dst* – это пути, заданные строками. Если *follow\_symlinks* равно false и оба *src* и *dst* являются символическими ссылками, [`copymode()`](https://python-all.ru/3.4/library/shutil.html#shutil.copymode) попытается изменить режим самой *dst* (а не файла, на который она указывает). Эта функциональность доступна не на всех платформах; пожалуйста, обратитесь к [`copystat()`](https://python-all.ru/3.4/library/shutil.html#shutil.copystat) для получения дополнительной информации. Если [`copymode()`](https://python-all.ru/3.4/library/shutil.html#shutil.copymode) не может модифицировать символические ссылки на данной платформе, и её просят это сделать, она ничего не делает и возвращается.4849Изменено в версии 3.3: Добавлен аргумент *follow\_symlinks*.5051#### `shutil.copystat(src, dst, *, follow_symlinks=True)`5253Копирует биты прав доступа, время последнего доступа, время последнего изменения и флаги из *src* в *dst*. На Linux [`copystat()`](https://python-all.ru/3.4/library/shutil.html#shutil.copystat) также копирует «расширенные атрибуты», если это возможно. Содержимое файла, владелец и группа не изменяются. *src* и *dst* – это пути, заданные строками.5455Если *follow\_symlinks* равно false и *src* и *dst* обе являются символическими ссылками, [`copystat()`](https://python-all.ru/3.4/library/shutil.html#shutil.copystat) будет работать с самими символическими ссылками, а не с файлами, на которые они указывают – читая информацию из символической ссылки *src* и записывая информацию в символическую ссылку *dst*.5657> **Примечание**58>59> Не все платформы предоставляют возможность просматривать и изменять символические ссылки. Python сам может сообщить, какая функциональность доступна локально.60>61> - Если `os.chmod in os.supports_follow_symlinks` равно `True`, [`copystat()`](https://python-all.ru/3.4/library/shutil.html#shutil.copystat) может изменять биты прав доступа символической ссылки.62> - Если `os.utime in os.supports_follow_symlinks` равно `True`, [`copystat()`](https://python-all.ru/3.4/library/shutil.html#shutil.copystat) может изменять время последнего доступа и время последнего изменения символической ссылки.63> - Если `os.chflags in os.supports_follow_symlinks` равно `True`, [`copystat()`](https://python-all.ru/3.4/library/shutil.html#shutil.copystat) может изменять флаги символической ссылки. (`os.chflags` доступна не на всех платформах.)64>65> На платформах, где часть или вся эта функциональность недоступна, при запросе на модификацию символической ссылки [`copystat()`](https://python-all.ru/3.4/library/shutil.html#shutil.copystat) скопирует всё, что сможет. [`copystat()`](https://python-all.ru/3.4/library/shutil.html#shutil.copystat) никогда не возвращает ошибку.66>67> Пожалуйста, обратитесь к [`os.supports_follow_symlinks`](https://python-all.ru/3.4/library/os.html#os.supports_follow_symlinks) для получения дополнительной информации.6869Изменено в версии 3.3: Добавлен аргумент *follow\_symlinks* и поддержка расширенных атрибутов Linux.7071#### `shutil.copy(src, dst, *, follow_symlinks=True)`7273Копирует файл *src* в файл или каталог *dst*. *src* и *dst* должны быть строками. Если *dst* указывает на каталог, файл будет скопирован в *dst* с использованием базового имени из *src*. Возвращает путь к только что созданному файлу.7475Если *follow\_symlinks* имеет значение false и *src* является символической ссылкой, *dst* будет создан как символическая ссылка. Если *follow\_symlinks* имеет значение true и *src* является символической ссылкой, *dst* будет копией файла, на который указывает *src*.7677[`copy()`](https://python-all.ru/3.4/library/copy.html#module-copy) копирует данные файла и режим прав доступа к файлу (см. [`os.chmod()`](https://python-all.ru/3.4/library/os.html#os.chmod)). Другие метаданные, такие как время создания и модификации файла, не сохраняются. Чтобы сохранить все метаданные из оригинала, используйте вместо этого [`copy2()`](https://python-all.ru/3.4/library/shutil.html#shutil.copy2).7879Изменено в версии 3.3: Добавлен аргумент *follow\_symlinks*. Теперь возвращает путь к созданному файлу.8081#### `shutil.copy2(src, dst, *, follow_symlinks=True)`8283Идентична [`copy()`](https://python-all.ru/3.4/library/shutil.html#shutil.copy), за исключением того, что [`copy2()`](https://python-all.ru/3.4/library/shutil.html#shutil.copy2) также пытается сохранить все метаданные файла.8485Когда *follow\_symlinks* равно false и *src* является символической ссылкой, [`copy2()`](https://python-all.ru/3.4/library/shutil.html#shutil.copy2) пытается скопировать все метаданные из символической ссылки *src* в только что созданную символическую ссылку *dst*. Однако эта функциональность доступна не на всех платформах. На платформах, где часть или вся эта функциональность недоступна, [`copy2()`](https://python-all.ru/3.4/library/shutil.html#shutil.copy2) сохранит все метаданные, которые сможет; [`copy2()`](https://python-all.ru/3.4/library/shutil.html#shutil.copy2) никогда не возвращает ошибку.8687[`copy2()`](https://python-all.ru/3.4/library/shutil.html#shutil.copy2) использует [`copystat()`](https://python-all.ru/3.4/library/shutil.html#shutil.copystat) для копирования метаданных файла. Пожалуйста, обратитесь к [`copystat()`](https://python-all.ru/3.4/library/shutil.html#shutil.copystat) для получения дополнительной информации о поддержке платформой модификации метаданных символической ссылки.8889Изменено в версии 3.3: Добавлен аргумент *follow\_symlinks*, также предпринята попытка копировать расширенные атрибуты файловой системы (пока только Linux). Теперь возвращает путь к созданному файлу.9091#### `shutil.ignore_patterns(*patterns)`9293Эта фабричная функция создаёт функцию, которую можно использовать в качестве вызываемого объекта для [`copytree()`](https://python-all.ru/3.4/library/shutil.html#shutil.copytree) аргумента *ignore*, игнорируя файлы и каталоги, соответствующие одному из предоставленных шаблонов в стиле glob *patterns*. Смотрите пример ниже.9495#### `shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False)`9697Рекурсивно копирует всё дерево каталогов с корнем в *src*, возвращая целевой каталог. Целевой каталог, заданный *dst*, не должен уже существовать; он будет создан вместе с отсутствующими родительскими каталогами. Права доступа и временные метки каталогов копируются с помощью [`copystat()`](https://python-all.ru/3.4/library/shutil.html#shutil.copystat), отдельные файлы копируются с помощью [`shutil.copy2()`](https://python-all.ru/3.4/library/shutil.html#shutil.copy2).9899Если *symlinks* имеет значение true, символические ссылки в исходном дереве представляются как символические ссылки в новом дереве, и метаданные исходных ссылок будут скопированы насколько это позволяет платформа; если false или аргумент опущен, содержимое и метаданные файлов, на которые указывают ссылки, копируются в новое дерево.100101Когда *symlinks* равно false, если файл, на который указывает символьная ссылка, не существует, в конец процесса копирования в список ошибок будет добавлено исключение, которое будет возбуждено как [`Error`](https://python-all.ru/3.4/library/shutil.html#shutil.Error). Можно установить необязательный флаг *ignore\_dangling\_symlinks* в true, чтобы подавить это исключение. Обратите внимание, что эта опция не влияет на платформы, не поддерживающие [`os.symlink()`](https://python-all.ru/3.4/library/os.html#os.symlink).102103Если задан *ignore*, он должен быть вызываемым объектом, который будет получать в качестве аргументов каталог, посещаемый функцией [`copytree()`](https://python-all.ru/3.4/library/shutil.html#shutil.copytree), и список его содержимого, возвращаемый функцией [`os.listdir()`](https://python-all.ru/3.4/library/os.html#os.listdir). Поскольку [`copytree()`](https://python-all.ru/3.4/library/shutil.html#shutil.copytree) вызывается рекурсивно, вызываемый объект *ignore* будет вызываться один раз для каждого копируемого каталога. Вызываемый объект должен возвращать последовательность имён каталогов и файлов относительно текущего каталога (т.е. подмножество элементов своего второго аргумента); эти имена затем будут игнорироваться в процессе копирования. [`ignore_patterns()`](https://python-all.ru/3.4/library/shutil.html#shutil.ignore_patterns) можно использовать для создания такого вызываемого объекта, который игнорирует имена на основе шаблонов в стиле glob.104105Если возникнут исключения, возбуждается исключение [`Error`](https://python-all.ru/3.4/library/shutil.html#shutil.Error) со списком причин.106107Если задан *copy\_function*, он должен быть вызываемым объектом, который будет использоваться для копирования каждого файла. Он будет вызван с исходным и целевым путями в качестве аргументов. По умолчанию используется [`shutil.copy2()`](https://python-all.ru/3.4/library/shutil.html#shutil.copy2), но может использоваться любая функция, поддерживающая ту же сигнатуру (например, [`shutil.copy()`](https://python-all.ru/3.4/library/shutil.html#shutil.copy)).108109Изменено в версии 3.3: Копирует метаданные, когда *symlinks* имеет значение false. Теперь возвращает *dst*.110111Изменено в версии 3.2: Добавлен аргумент *copy\_function*, позволяющий указать собственную функцию копирования. Добавлен аргумент *ignore\_dangling\_symlinks* для подавления ошибок оборванных символических ссылок, когда *symlinks* имеет значение false.112113#### `shutil.rmtree(path, ignore_errors=False, onerror=None)`114115Удаляет целое дерево каталогов; *path* должен указывать на каталог (но не на символическую ссылку на каталог). Если *ignore\_errors* равен true, ошибки, возникающие при неудачном удалении, игнорируются; если false или не указан, такие ошибки обрабатываются вызовом обработчика, заданного *onerror*, или, если он не указан, вызывается исключение.116117> **Примечание**118>119> На платформах, поддерживающих необходимые функции, основанные на файловых дескрипторах, по умолчанию используется устойчивая к символьным ссылкам версия [`rmtree()`](https://python-all.ru/3.4/library/shutil.html#shutil.rmtree). На других платформах реализация [`rmtree()`](https://python-all.ru/3.4/library/shutil.html#shutil.rmtree) подвержена атаке через символьные ссылки: при правильном выборе времени и обстоятельств злоумышленники могут манипулировать символьными ссылками в файловой системе, чтобы удалить файлы, к которым иначе они не могли бы получить доступ. Приложения могут использовать атрибут функции [`rmtree.avoids_symlink_attacks`](https://python-all.ru/3.4/library/shutil.html#shutil.rmtree.avoids_symlink_attacks), чтобы определить, какой случай применим.120121Если *onerror* задан, он должен быть вызываемым объектом, принимающим три параметра: *function*, *path* и *excinfo*.122123Первый параметр, *function*, – это функция, вызвавшая исключение; он зависит от платформы и реализации. Второй параметр, *path*, – это имя пути, переданное функции *function*. Третий параметр, *excinfo*, – это информация об исключении, возвращаемая функцией [`sys.exc_info()`](https://python-all.ru/3.4/library/sys.html#sys.exc_info). Исключения, возбуждённые внутри *onerror*, перехвачены не будут.124125Изменено в версии 3.3: Добавлена версия, устойчивая к атакам через символические ссылки, которая используется автоматически, если платформа поддерживает функции на основе файловых дескрипторов.126127#### `rmtree.avoids_symlink_attacks`128129Указывает, предоставляют ли текущая платформа и реализация устойчивую к символьным ссылкам версию [`rmtree()`](https://python-all.ru/3.4/library/shutil.html#shutil.rmtree). В настоящее время это верно только для платформ, поддерживающих функции доступа к каталогам на основе файловых дескрипторов.130131Новое в версии 3.3.132133#### `shutil.move(src, dst)`134135Рекурсивно перемещает файл или каталог (*src*) в другое место (*dst*) и возвращает путь назначения.136137Если целевой объект является существующим каталогом, то *src* перемещается внутрь этого каталога. Если целевой объект уже существует, но не является каталогом, он может быть перезаписан в зависимости от семантики [`os.rename()`](https://python-all.ru/3.4/library/os.html#os.rename).138139Если целевой объект находится в текущей файловой системе, используется [`os.rename()`](https://python-all.ru/3.4/library/os.html#os.rename). В противном случае *src* копируется (с помощью [`shutil.copy2()`](https://python-all.ru/3.4/library/shutil.html#shutil.copy2)) в *dst*, а затем удаляется. В случае символьных ссылок будет создана новая символьная ссылка, указывающая на цель *src*, в или как *dst*, и *src* будет удалена.140141Изменено в версии 3.3: Добавлена явная обработка символических ссылок для внешних файловых систем, что адаптирует поведение к GNU **mv**. Теперь возвращает *dst*.142143#### `shutil.disk_usage(path)`144145Возвращает статистику использования диска для указанного пути в виде [*именованного кортежа*](https://python-all.ru/3.4/glossary.html#term-named-tuple) с атрибутами *total*, *used* и *free*, которые содержат общий, используемый и свободный объём в байтах.146147Новое в версии 3.3.148149Доступность: Unix, Windows.150151#### `shutil.chown(path, user=None, group=None)`152153Изменяет владельца *user* и/или группу *group* для указанного *path*.154155*user* может быть системным именем пользователя или uid; то же самое относится к *group*. Требуется хотя бы один аргумент.156157См. также [`os.chown()`](https://python-all.ru/3.4/library/os.html#os.chown) – нижележащую функцию.158159Доступность: Unix.160161Новое в версии 3.3.162163#### `shutil.which(cmd, mode=os.F_OK | os.X_OK, path=None)`164165Возвращает путь к исполняемому файлу, который был бы запущен, если бы была вызвана указанная *cmd*. Если ни одна *cmd* не будет вызвана, возвращает `None`.166167*mode* – это маска прав доступа, передаваемая в [`os.access()`](https://python-all.ru/3.4/library/os.html#os.access); по умолчанию определяет, существует ли файл и является ли он исполняемым.168169Если *path* не указан, используются результаты [`os.environ()`](https://python-all.ru/3.4/library/os.html#os.environ), возвращающие либо значение «PATH», либо резервное значение [`os.defpath`](https://python-all.ru/3.4/library/os.html#os.defpath).170171В Windows текущий каталог всегда добавляется в начало *path*, независимо от того, используется значение по умолчанию или предоставляется собственное, – это поведение, которое командная оболочка использует при поиске исполняемых файлов. Кроме того, при поиске *cmd* в *path* проверяется переменная окружения `PATHEXT`. Например, если вызвать `shutil.which("python")`, [`which()`](https://python-all.ru/3.4/library/shutil.html#shutil.which) будет искать в `PATHEXT`, чтобы узнать, что нужно искать `python.exe` в каталогах *path*. Например, в Windows:172173```python174>>> shutil.which("python")175'C:\\Python33\\python.EXE'176```177178Новое в версии 3.3.179180#### `exception shutil.Error`181182Это исключение собирает исключения, возбуждённые во время операции с несколькими файлами. Для [`copytree()`](https://python-all.ru/3.4/library/shutil.html#shutil.copytree) аргумент исключения представляет собой список трёхэлементных кортежей (*srcname*, *dstname*, *исключение*).183184### 11.10.1.1. Пример copytree185186Этот пример является реализацией функции [`copytree()`](https://python-all.ru/3.4/library/shutil.html#shutil.copytree), описанной выше, с опущенной строкой документации. Он демонстрирует многие другие функции, предоставляемые этим модулем.187188```python189def copytree(src, dst, symlinks=False):190    names = os.listdir(src)191    os.makedirs(dst)192    errors = []193    for name in names:194        srcname = os.path.join(src, name)195        dstname = os.path.join(dst, name)196        try:197            if symlinks and os.path.islink(srcname):198                linkto = os.readlink(srcname)199                os.symlink(linkto, dstname)200            elif os.path.isdir(srcname):201                copytree(srcname, dstname, symlinks)202            else:203                copy2(srcname, dstname)204            # XXX Что насчет устройств, сокетов и т.д.?205        except OSError as why:206            errors.append((srcname, dstname, str(why)))207        # перехватываем ошибку от рекурсивного copytree, чтобы мы могли208        # продолжить с другими файлами209        except Error as err:210            errors.extend(err.args[0])211    try:212        copystat(src, dst)213    except OSError as why:214        # не удается скопировать время доступа к файлам в Windows215        if why.winerror is None:216            errors.extend((src, dst, str(why)))217    if errors:218        raise Error(errors)219```220221Другой пример, использующий вспомогательную функцию [`ignore_patterns()`](https://python-all.ru/3.4/library/shutil.html#shutil.ignore_patterns):222223```python224from shutil import copytree, ignore_patterns225226copytree(source, destination, ignore=ignore_patterns('*.pyc', 'tmp*'))227```228229Это скопирует все, кроме файлов `.pyc` и файлов или каталогов, имя которых начинается с `tmp`.230231Ещё один пример, использующий аргумент *ignore* для добавления вызова журналирования:232233```python234from shutil import copytree235import logging236237def _logpath(path, names):238    logging.info('Working in %s' % path)239    return []   # ничего не будет проигнорировано240241copytree(source, destination, ignore=_logpath)242```243244## 11.10.2. Операции архивации245246Новое в версии 3.2.247248Также предоставляются высокоуровневые утилиты для создания и чтения сжатых и архивных файлов. Они полагаются на модули [`zipfile`](https://python-all.ru/3.4/library/zipfile.html#module-zipfile) и [`tarfile`](https://python-all.ru/3.4/library/tarfile.html#module-tarfile).249250#### `shutil.make_archive(base_name, format[, root_dir[, base_dir[, verbose[, dry_run[, owner[, group[, logger]]]]]]])`251252Создаёт архивный файл (например, zip или tar) и возвращает его имя.253254*base\_name* – это имя создаваемого файла, включая путь, без расширения, специфичного для формата. *format* – это формат архива: один из «zip», «tar», «bztar» (если доступен модуль [`bz2`](https://python-all.ru/3.4/library/bz2.html#module-bz2)) или «gztar».255256*root\_dir* – это каталог, который будет корневым каталогом архива; например, мы обычно переходим в *root\_dir* перед созданием архива.257258*base\_dir* – это каталог, из которого начинается архивирование; т.е. *base\_dir* будет общим префиксом всех файлов и каталогов в архиве.259260*root\_dir* и *base\_dir* по умолчанию равны текущему каталогу.261262Если *dry\_run* равен true, архив не создаётся, но операции, которые были бы выполнены, записываются в журнал *logger*.263264*owner* и *group* используются при создании tar-архива. По умолчанию используются текущий владелец и группа.265266*logger* должен быть объектом, совместимым с [**PEP 282**](https://python-all.ru/3.4/library/shutil.html), обычно экземпляром [`logging.Logger`](https://python-all.ru/3.4/library/logging.html#logging.Logger).267268Аргумент *verbose* не используется и является устаревшим.269270#### `shutil.get_archive_formats()`271272Возвращает список поддерживаемых форматов архивирования. Каждый элемент возвращаемой последовательности представляет собой кортеж `(name, description)`.273274По умолчанию [`shutil`](https://python-all.ru/3.4/library/shutil.html#module-shutil) предоставляет следующие форматы:275276- *gztar*: tar-файл, сжатый gzip277- *bztar*: tar-файл, сжатый bzip2 (если доступен модуль [`bz2`](https://python-all.ru/3.4/library/bz2.html#module-bz2)).278- *tar*: несжатый tar-файл279- *zip*: ZIP-файл280281Можно зарегистрировать новые форматы или предоставить собственный архиватор для любых существующих форматов, используя [`register_archive_format()`](https://python-all.ru/3.4/library/shutil.html#shutil.register_archive_format).282283#### `shutil.register_archive_format(name, function[, extra_args[, description]])`284285Регистрирует архиватор для формата *name*.286287*function* – это вызываемый объект, который будет использоваться для распаковки архивов. Вызываемый объект получит *base\_name* создаваемого файла, а затем *base\_dir* (по умолчанию [`os.curdir`](https://python-all.ru/3.4/library/os.html#os.curdir)), с которого начинается архивация. Остальные аргументы передаются как именованные: *owner*, *group*, *dry\_run* и *logger* (как передаются в [`make_archive()`](https://python-all.ru/3.4/library/shutil.html#shutil.make_archive)).288289Если задано, *extra\_args* – это последовательность пар `(name, value)`, которые будут использоваться как дополнительные именованные аргументы при вызове архиватора.290291*description* используется [`get_archive_formats()`](https://python-all.ru/3.4/library/shutil.html#shutil.get_archive_formats), которая возвращает список архиваторов. По умолчанию – пустая строка.292293#### `shutil.unregister_archive_format(name)`294295Удалите имя формата архива *name* из списка поддерживаемых форматов.296297#### `shutil.unpack_archive(filename[, extract_dir[, format]])`298299Распаковывает архив. *filename* – это полный путь к архиву.300301*extract\_dir* – имя целевой директории, в которую распаковывается архив. Если не указано, используется текущая рабочая директория.302303*format* – это формат архива: один из «zip», «tar» или «gztar». Или любой другой формат, зарегистрированный с помощью [`register_unpack_format()`](https://python-all.ru/3.4/library/shutil.html#shutil.register_unpack_format). Если не указан, [`unpack_archive()`](https://python-all.ru/3.4/library/shutil.html#shutil.unpack_archive) использует расширение имени файла архива и проверяет, зарегистрирован ли распаковщик для этого расширения. Если ни один не найден, возбуждается [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError).304305#### `shutil.register_unpack_format(name, extensions, function[, extra_args[, description]])`306307Регистрирует формат распаковки. *name* – это имя формата, а *extensions* – список расширений, соответствующих формату, например `.zip` для Zip-файлов.308309*function* – это вызываемый объект, который будет использоваться для распаковки архивов. Вызываемый объект будет получать путь к архиву, за которым следует каталог, в который необходимо извлечь архив.310311Если указано, *extra\_args* – это последовательность кортежей `(name, value)`, которые будут переданы как именованные аргументы вызываемому объекту.312313*description* может быть указан для описания формата и будет возвращён функцией [`get_unpack_formats()`](https://python-all.ru/3.4/library/shutil.html#shutil.get_unpack_formats).314315#### `shutil.unregister_unpack_format(name)`316317Отменяет регистрацию формата распаковки. *name* – имя формата.318319#### `shutil.get_unpack_formats()`320321Возвращает список всех зарегистрированных форматов распаковки. Каждый элемент возвращаемой последовательности – это кортеж `(name, extensions, description)`.322323По умолчанию [`shutil`](https://python-all.ru/3.4/library/shutil.html#module-shutil) предоставляет следующие форматы:324325- *gztar*: tar-файл, сжатый gzip326- *bztar*: tar-файл, сжатый bzip2 (если доступен модуль [`bz2`](https://python-all.ru/3.4/library/bz2.html#module-bz2)).327- *tar*: несжатый tar-файл328- *zip*: ZIP-файл329330Можно зарегистрировать новые форматы или предоставить собственный распаковщик для любых существующих форматов, используя [`register_unpack_format()`](https://python-all.ru/3.4/library/shutil.html#shutil.register_unpack_format).331332### 11.10.2.1. Пример архивации333334В этом примере создаётся tar-архив, сжатый gzip, содержащий все файлы, найденные в каталоге пользователя `.ssh`:335336```python337>>> from shutil import make_archive338>>> import os339>>> archive_name = os.path.expanduser(os.path.join('~', 'myarchive'))340>>> root_dir = os.path.expanduser(os.path.join('~', '.ssh'))341>>> make_archive(archive_name, 'gztar', root_dir)342'/Users/tarek/myarchive.tar.gz'343```344345Полученный архив содержит:346347```python348$ tar -tzvf /Users/tarek/myarchive.tar.gz349drwx------ tarek/staff       0 2010-02-01 16:23:40 ./350-rw-r--r-- tarek/staff     609 2008-06-09 13:26:54 ./authorized_keys351-rwxr-xr-x tarek/staff      65 2008-06-09 13:26:54 ./config352-rwx------ tarek/staff     668 2008-06-09 13:26:54 ./id_dsa353-rwxr-xr-x tarek/staff     609 2008-06-09 13:26:54 ./id_dsa.pub354-rw------- tarek/staff    1675 2008-06-09 13:26:54 ./id_rsa355-rw-r--r-- tarek/staff     397 2008-06-09 13:26:54 ./id_rsa.pub356-rw-r--r-- tarek/staff   37192 2010-02-06 18:23:10 ./known_hosts357```358359## 11.10.3. Определение размера выходного терминала360361Новое в версии 3.3.362363#### `shutil.get_terminal_size(fallback=(columns, lines))`364365Получить размер окна терминала.366367Для каждого из двух измерений проверяется соответствующая переменная окружения: `COLUMNS` и `LINES`. Если переменная определена и её значение – положительное целое число, оно используется.368369Если `COLUMNS` или `LINES` не определены (что бывает чаще всего), запрашивается терминал, подключённый к [`sys.__stdout__`](https://python-all.ru/3.4/library/sys.html#sys.__stdout__), путём вызова [`os.get_terminal_size()`](https://python-all.ru/3.4/library/os.html#os.get_terminal_size).370371Если размер терминала не удаётся получить – либо из-за того, что система не поддерживает запрос, либо потому, что нет подключения к терминалу, – используется значение, указанное в параметре `fallback`. `fallback` по умолчанию равен `(80, 24)`, что является размером, используемым по умолчанию во многих эмуляторах терминала.372373Возвращаемое значение – именованный кортеж типа [`os.terminal_size`](https://python-all.ru/3.4/library/os.html#os.terminal_size).374375См. также: The Single UNIX Specification, Version 2, [Другие переменные окружения](https://python-all.ru/3.4/library/shutil.html).376