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

shutil.md

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

1> **Источник:** https://python-all.ru/3.7/library/shutil.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`shutil`](https://python-all.ru/3.7/library/shutil.html#module-shutil) – высокоуровневые операции с файлами89**Исходный код:** [Lib/shutil.py](https://python-all.ru/src/3.7/Lib/shutil.py)1011---1213Модуль [`shutil`](https://python-all.ru/3.7/library/shutil.html#module-shutil) предоставляет ряд высокоуровневых операций с файлами и наборами файлов. В частности, предоставлены функции, которые поддерживают копирование и удаление файлов. Для операций с отдельными файлами см. также модуль [`os`](https://python-all.ru/3.7/library/os.html#module-os).1415> **Предупреждение**16>17> Даже функции копирования файлов высокого уровня ([`shutil.copy()`](https://python-all.ru/3.7/library/shutil.html#shutil.copy), [`shutil.copy2()`](https://python-all.ru/3.7/library/shutil.html#shutil.copy2)) не могут скопировать все метаданные файла.18>19> На платформах POSIX это означает, что владелец и группа файла теряются, а также ACL. На Mac OS не используются ресурсные форки и другие метаданные. Это означает, что ресурсы будут потеряны, а коды типа и создателя файла будут некорректными. В Windows владельцы файлов, ACL и альтернативные потоки данных не копируются.2021## Операции с каталогами и файлами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.7/library/shutil.html#shutil.copy) для копирования, принимающего путь к целевому каталогу. Если *src* и *dst* указывают на один и тот же файл, возбуждается [`SameFileError`](https://python-all.ru/3.7/library/shutil.html#shutil.SameFileError).3031Целевое расположение должно быть доступно для записи; в противном случае будет возбуждено исключение [`OSError`](https://python-all.ru/3.7/library/exceptions.html#OSError). Если *dst* уже существует, оно будет заменено. Специальные файлы, такие как символьные или блочные устройства и каналы, не могут быть скопированы с помощью этой функции.3233Если *follow\_symlinks* имеет значение false и *src* является символической ссылкой, будет создана новая символическая ссылка вместо копирования файла, на который указывает *src*.3435Изменено в версии 3.3: [`IOError`](https://python-all.ru/3.7/library/exceptions.html#IOError) ранее возбуждалось вместо [`OSError`](https://python-all.ru/3.7/library/exceptions.html#OSError). Добавлен аргумент *follow\_symlinks*. Теперь возвращает *dst*.3637Изменено в версии 3.4: Возбуждается [`SameFileError`](https://python-all.ru/3.7/library/shutil.html#shutil.SameFileError) вместо [`Error`](https://python-all.ru/3.7/library/shutil.html#shutil.Error). Поскольку первое является подклассом второго, это изменение обратно совместимо.3839#### `exception shutil.SameFileError`4041Это исключение возбуждается, если источник и назначение в [`copyfile()`](https://python-all.ru/3.7/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.7/library/shutil.html#shutil.copymode) попытается изменить режим самой *dst* (а не файла, на который она указывает). Эта функциональность доступна не на всех платформах; пожалуйста, смотрите [`copystat()`](https://python-all.ru/3.7/library/shutil.html#shutil.copystat) для дополнительной информации. Если [`copymode()`](https://python-all.ru/3.7/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.7/library/shutil.html#shutil.copystat) также копирует «расширенные атрибуты», где это возможно. Содержимое файла, владелец и группа не затрагиваются. *src* и *dst* – пути, заданные строками.5455Если *follow\_symlinks* имеет значение false и *src* и *dst* оба ссылаются на символические ссылки, [`copystat()`](https://python-all.ru/3.7/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.7/library/shutil.html#shutil.copystat) может изменять биты разрешений символической ссылки.62> - Если `os.utime in os.supports_follow_symlinks` равен `True`, [`copystat()`](https://python-all.ru/3.7/library/shutil.html#shutil.copystat) может изменять время последнего доступа и изменения символической ссылки.63> - Если `os.chflags in os.supports_follow_symlinks` равно `True`, [`copystat()`](https://python-all.ru/3.7/library/shutil.html#shutil.copystat) может изменять флаги символической ссылки. (`os.chflags` доступен не на всех платформах.)64>65> На платформах, где часть или вся эта функциональность недоступна, при попытке изменить символическую ссылку [`copystat()`](https://python-all.ru/3.7/library/shutil.html#shutil.copystat) скопирует всё, что сможет. [`copystat()`](https://python-all.ru/3.7/library/shutil.html#shutil.copystat) никогда не возвращает ошибку.66>67> Подробнее см. [`os.supports_follow_symlinks`](https://python-all.ru/3.7/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.7/library/shutil.html#shutil.copy) копирует данные файла и его режим доступа (см. [`os.chmod()`](https://python-all.ru/3.7/library/os.html#os.chmod)). Другие метаданные, такие как время создания и изменения файла, не сохраняются. Чтобы сохранить все метаданные исходного файла, используйте [`copy2()`](https://python-all.ru/3.7/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.7/library/shutil.html#shutil.copy), за исключением того, что [`copy2()`](https://python-all.ru/3.7/library/shutil.html#shutil.copy2) также пытается сохранить метаданные файла.8485Когда *follow\_symlinks* равно false, и *src* является символической ссылкой, [`copy2()`](https://python-all.ru/3.7/library/shutil.html#shutil.copy2) пытается скопировать все метаданные из символической ссылки *src* в только что созданную символическую ссылку *dst*. Однако эта функциональность доступна не на всех платформах. На платформах, где некоторой или всей этой функциональности нет, [`copy2()`](https://python-all.ru/3.7/library/shutil.html#shutil.copy2) сохранит все метаданные, которые сможет; [`copy2()`](https://python-all.ru/3.7/library/shutil.html#shutil.copy2) никогда не возвращает ошибку.8687[`copy2()`](https://python-all.ru/3.7/library/shutil.html#shutil.copy2) использует [`copystat()`](https://python-all.ru/3.7/library/shutil.html#shutil.copystat) для копирования метаданных файла. Подробнее о поддержке платформами изменения метаданных символических ссылок см. [`copystat()`](https://python-all.ru/3.7/library/shutil.html#shutil.copystat).8889Изменено в версии 3.3: Добавлен аргумент *follow\_symlinks*, также предпринята попытка копировать расширенные атрибуты файловой системы (пока только Linux). Теперь возвращает путь к созданному файлу.9091#### `shutil.ignore_patterns(*patterns)`9293Эта фабричная функция создаёт функцию, которую можно использовать как вызываемый объект для аргумента *ignore* функции [`copytree()`](https://python-all.ru/3.7/library/shutil.html#shutil.copytree), игнорируя файлы и каталоги, соответствующие одному из предоставленных *шаблонов* в стиле glob. См. пример ниже.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.7/library/shutil.html#shutil.copystat), отдельные файлы копируются с использованием [`shutil.copy2()`](https://python-all.ru/3.7/library/shutil.html#shutil.copy2).9899Если *symlinks* имеет значение true, символические ссылки в исходном дереве представляются как символические ссылки в новом дереве, и метаданные исходных ссылок будут скопированы насколько это позволяет платформа; если false или аргумент опущен, содержимое и метаданные файлов, на которые указывают ссылки, копируются в новое дерево.100101Когда *symlinks* равен false, если файл, на который указывает символическая ссылка, не\\ nсуществует, исключение будет добавлено в список ошибок, вызываемых в исключении [`Error`](https://python-all.ru/3.7/library/shutil.html#shutil.Error) в конце процесса копирования. Можно установить опциональный флаг *ignore\_dangling\_symlinks* в true, если требуется подавить это исключение. Обратите внимание, что эта опция не действует на платформах, не поддерживающих [`os.symlink()`](https://python-all.ru/3.7/library/os.html#os.symlink).102103Если задан *ignore*, это должен быть вызываемый объект, который будет получать в качестве аргументов каталог, обрабатываемый [`copytree()`](https://python-all.ru/3.7/library/shutil.html#shutil.copytree), и список его содержимого, возвращённый [`os.listdir()`](https://python-all.ru/3.7/library/os.html#os.listdir). Поскольку [`copytree()`](https://python-all.ru/3.7/library/shutil.html#shutil.copytree) вызывается рекурсивно, вызываемый объект *ignore* будет вызываться один раз для каждого копируемого каталога. Вызываемый объект должен возвращать последовательность имён каталогов и файлов относительно текущего каталога (т.е. подмножество элементов из его второго аргумента); эти имена будут игнорироваться в процессе копирования. [`ignore_patterns()`](https://python-all.ru/3.7/library/shutil.html#shutil.ignore_patterns) можно использовать для создания такого вызываемого объекта, который игнорирует имена на основе шаблонов в стиле glob.104105Если возникают исключения, вызывается [`Error`](https://python-all.ru/3.7/library/shutil.html#shutil.Error) со списком причин.106107Если задан *copy\_function*, это должен быть вызываемый объект, который будет использоваться для копирования каждого файла. Он будет вызван с исходным и целевым путями в качестве аргументов. По умолчанию используется [`shutil.copy2()`](https://python-all.ru/3.7/library/shutil.html#shutil.copy2), но можно использовать любую функцию с той же сигнатурой (например, [`shutil.copy()`](https://python-all.ru/3.7/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.7/library/shutil.html#shutil.rmtree), устойчивая к атакам через символические ссылки. На других платформах реализация [`rmtree()`](https://python-all.ru/3.7/library/shutil.html#shutil.rmtree) уязвима для такой атаки: при правильном выборе времени и обстоятельств злоумышленники могут манипулировать символическими ссылками в файловой системе, чтобы удалить файлы, к которым иначе у них не было бы доступа. Приложения могут использовать атрибут функции [`rmtree.avoids_symlink_attacks`](https://python-all.ru/3.7/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.7/library/sys.html#sys.exc_info). Исключения, вызванные *onerror*, не перехватываются.124125Изменено в версии 3.3: Добавлена версия, устойчивая к атакам через символические ссылки, которая используется автоматически, если платформа поддерживает функции на основе файловых дескрипторов.126127#### `rmtree.avoids_symlink_attacks`128129Указывает, предоставляют ли текущая платформа и реализация версию [`rmtree()`](https://python-all.ru/3.7/library/shutil.html#shutil.rmtree), устойчивую к атакам через символические ссылки. В настоящее время это верно только для платформ, поддерживающих функции доступа к каталогам на основе файловых дескрипторов.130131Новое в версии 3.3.132133#### `shutil.move(src, dst, copy_function=copy2)`134135Рекурсивно перемещает файл или каталог (*src*) в другое место (*dst*) и возвращает путь назначения.136137Если назначение – существующий каталог, то *src* перемещается внутрь этого каталога. Если назначение уже существует, но не является каталогом, оно может быть перезаписано в зависимости от семантики [`os.rename()`](https://python-all.ru/3.7/library/os.html#os.rename).138139Если назначение находится в той же файловой системе, то используется [`os.rename()`](https://python-all.ru/3.7/library/os.html#os.rename). В противном случае *src* копируется в *dst* с помощью *copy\_function* и затем удаляется. В случае символических ссылок будет создана новая символическая ссылка, указывающая на цель *src*, в или как *dst*, а *src* будет удалён.140141Если задан *copy\_function*, это должен быть вызываемый объект, принимающий два аргумента *src* и *dst*, и будет использован для копирования *src* в *dest*, если [`os.rename()`](https://python-all.ru/3.7/library/os.html#os.rename) не может быть использована. Если исходный объект является каталогом, вызывается [`copytree()`](https://python-all.ru/3.7/library/shutil.html#shutil.copytree), и ему передаётся `copy_function()`. Значение по умолчанию для *copy\_function* – [`copy2()`](https://python-all.ru/3.7/library/shutil.html#shutil.copy2). Использование [`copy()`](https://python-all.ru/3.7/library/shutil.html#shutil.copy) в качестве *copy\_function* позволяет выполнить перемещение, когда невозможно также скопировать метаданные, ценой отказа от копирования любых метаданных.142143Изменено в версии 3.3: Добавлена явная обработка символических ссылок для внешних файловых систем, что адаптирует поведение к GNU **mv**. Теперь возвращает *dst*.144145Изменено в версии 3.5: Добавлен именованный аргумент *copy\_function*.146147#### `shutil.disk_usage(path)`148149Возвращает статистику использования диска для заданного пути в виде [именованного кортежа](https://python-all.ru/3.7/glossary.html#term-named-tuple) с атрибутами *total*, *used* и *free*, которые представляют собой общий, используемый и свободный объём в байтах. В Windows *path* должен быть каталогом; в Unix это может быть файл или каталог.150151Новое в версии 3.3.152153[Доступность](https://python-all.ru/3.7/library/intro.html#availability): Unix, Windows.154155#### `shutil.chown(path, user=None, group=None)`156157Изменяет владельца *user* и/или группу *group* для указанного *path*.158159*user* может быть системным именем пользователя или uid; то же самое относится к *group*. Требуется хотя бы один аргумент.160161См. также [`os.chown()`](https://python-all.ru/3.7/library/os.html#os.chown) – базовую функцию.162163[Доступность](https://python-all.ru/3.7/library/intro.html#availability): Unix.164165Новое в версии 3.3.166167#### `shutil.which(cmd, mode=os.F_OK | os.X_OK, path=None)`168169Возвращает путь к исполняемому файлу, который был бы запущен, если бы была вызвана заданная команда *cmd*. Если команда *cmd* не будет вызвана, возвращает `None`.170171*mode* – это маска разрешений, передаваемая в [`os.access()`](https://python-all.ru/3.7/library/os.html#os.access), по умолчанию определяющая, существует ли файл и является ли он исполняемым.172173Если *path* не указан, используются результаты [`os.environ()`](https://python-all.ru/3.7/library/os.html#os.environ), возвращающие либо значение «PATH», либо запасной вариант [`os.defpath`](https://python-all.ru/3.7/library/os.html#os.defpath).174175В Windows текущий каталог всегда добавляется в начало *path*, независимо от того, используется значение по умолчанию или указано своё; такое же поведение применяет командная оболочка при поиске исполняемых файлов. Кроме того, при поиске *cmd* в *path* проверяется переменная окружения `PATHEXT`. Например, при вызове `shutil.which("python")` функция [`which()`](https://python-all.ru/3.7/library/shutil.html#shutil.which) будет искать `PATHEXT`, чтобы узнать, что нужно искать `python.exe` в каталогах из *path*. Например, в Windows:176177```python178>>> shutil.which("python")179'C:\\Python33\\python.EXE'180```181182Новое в версии 3.3.183184#### `exception shutil.Error`185186Это исключение собирает исключения, возникающие во время операции с несколькими файлами. Для [`copytree()`](https://python-all.ru/3.7/library/shutil.html#shutil.copytree) аргумент исключения представляет собой список кортежей из трёх элементов (*srcname*, *dstname*, *исключение*).187188### Пример copytree189190Этот пример представляет собой реализацию функции [`copytree()`](https://python-all.ru/3.7/library/shutil.html#shutil.copytree), описанной выше, с опущенной строкой документации. Он демонстрирует многие другие функции, предоставляемые этим модулем.191192```python193def copytree(src, dst, symlinks=False):194    names = os.listdir(src)195    os.makedirs(dst)196    errors = []197    for name in names:198        srcname = os.path.join(src, name)199        dstname = os.path.join(dst, name)200        try:201            if symlinks and os.path.islink(srcname):202                linkto = os.readlink(srcname)203                os.symlink(linkto, dstname)204            elif os.path.isdir(srcname):205                copytree(srcname, dstname, symlinks)206            else:207                copy2(srcname, dstname)208            # XXX Что насчет устройств, сокетов и т.д.?209        except OSError as why:210            errors.append((srcname, dstname, str(why)))211        # перехватываем ошибку от рекурсивного copytree, чтобы мы могли212        # продолжить с другими файлами213        except Error as err:214            errors.extend(err.args[0])215    try:216        copystat(src, dst)217    except OSError as why:218        # не удается скопировать время доступа к файлам в Windows219        if why.winerror is None:220            errors.extend((src, dst, str(why)))221    if errors:222        raise Error(errors)223```224225Ещё один пример, использующий вспомогательную функцию [`ignore_patterns()`](https://python-all.ru/3.7/library/shutil.html#shutil.ignore_patterns):226227```python228from shutil import copytree, ignore_patterns229230copytree(source, destination, ignore=ignore_patterns('*.pyc', 'tmp*'))231```232233При этом будет скопировано всё, кроме файлов `.pyc` и файлов или каталогов, имена которых начинаются с `tmp`.234235Ещё один пример, использующий аргумент *ignore* для добавления вызова журналирования:236237```python238from shutil import copytree239import logging240241def _logpath(path, names):242    logging.info('Working in %s', path)243    return []   # ничего не будет проигнорировано244245copytree(source, destination, ignore=_logpath)246```247248### Пример rmtree249250В этом примере показано, как удалить дерево каталогов в Windows, когда у некоторых файлов установлен бит «только для чтения». Он использует колбэк onerror для снятия бита только для чтения и повторной попытки удаления. Любые последующие ошибки будут распространяться.251252```python253import os, stat254import shutil255256def remove_readonly(func, path, _):257    "Clear the readonly bit and reattempt the removal"258    os.chmod(path, stat.S_IWRITE)259    func(path)260261shutil.rmtree(directory, onerror=remove_readonly)262```263264## Операции архивирования265266Новое в версии 3.2.267268Изменено в версии 3.5: Добавлена поддержка формата *xztar*.269270Также предоставляются высокоуровневые утилиты для создания и чтения сжатых и архивных файлов. Они основаны на модулях [`zipfile`](https://python-all.ru/3.7/library/zipfile.html#module-zipfile) и [`tarfile`](https://python-all.ru/3.7/library/tarfile.html#module-tarfile).271272#### `shutil.make_archive(base_name, format[, root_dir[, base_dir[, verbose[, dry_run[, owner[, group[, logger]]]]]]])`273274Создаёт архивный файл (например, zip или tar) и возвращает его имя.275276*base\_name* – имя создаваемого файла, включая путь, без формато-специфического расширения. *format* – формат архива: один из «zip» (если доступен модуль [`zlib`](https://python-all.ru/3.7/library/zlib.html#module-zlib)), «tar», «gztar» (если доступен модуль [`zlib`](https://python-all.ru/3.7/library/zlib.html#module-zlib)), «bztar» (если доступен модуль [`bz2`](https://python-all.ru/3.7/library/bz2.html#module-bz2)) или «xztar» (если доступен модуль [`lzma`](https://python-all.ru/3.7/library/lzma.html#module-lzma)).277278*root\_dir* – это каталог, который будет корневым каталогом архива; все пути в архиве будут относительными по отношению к нему; например, перед созданием архива обычно выполняется chdir в *root\_dir*.279280*base\_dir* – это каталог, из которого начинается архивация; т. е. *base\_dir* будет общим префиксом для всех файлов и каталогов в архиве. *base\_dir* должен быть указан относительно *root\_dir*. См. [Пример архивации с base\_dir](https://python-all.ru/3.7/library/shutil.html#shutil-archiving-example-with-basedir) о том, как использовать *base\_dir* и *root\_dir* вместе.281282*root\_dir* и *base\_dir* по умолчанию равны текущему каталогу.283284Если *dry\_run* равен true, архив не создаётся, но операции, которые были бы выполнены, записываются в журнал *logger*.285286*owner* и *group* используются при создании tar-архива. По умолчанию используются текущий владелец и группа.287288*logger* должен быть объектом, совместимым с [**PEP 282**](https://python-all.ru/3.7/library/shutil.html), обычно экземпляром [`logging.Logger`](https://python-all.ru/3.7/library/logging.html#logging.Logger).289290Аргумент *verbose* не используется и является устаревшим.291292#### `shutil.get_archive_formats()`293294Возвращает список поддерживаемых форматов архивации. Каждый элемент возвращаемой последовательности – это кортеж `(name, description)`.295296По умолчанию [`shutil`](https://python-all.ru/3.7/library/shutil.html#module-shutil) предоставляет следующие форматы:297298- *zip*: ZIP-файл (если доступен модуль [`zlib`](https://python-all.ru/3.7/library/zlib.html#module-zlib)).299- *tar*: несжатый tar-файл.300- *gztar*: tar-файл, сжатый gzip (если доступен модуль [`zlib`](https://python-all.ru/3.7/library/zlib.html#module-zlib)).301- *bztar*: tar-файл, сжатый bzip2 (если доступен модуль [`bz2`](https://python-all.ru/3.7/library/bz2.html#module-bz2)).302- *xztar*: tar-файл, сжатый xz (если доступен модуль [`lzma`](https://python-all.ru/3.7/library/lzma.html#module-lzma)).303304Можно зарегистрировать новые форматы или предоставить собственный архиватор для любого существующего формата, используя [`register_archive_format()`](https://python-all.ru/3.7/library/shutil.html#shutil.register_archive_format).305306#### `shutil.register_archive_format(name, function[, extra_args[, description]])`307308Регистрирует архиватор для формата *name*.309310*function* – это вызываемый объект, который будет использоваться для распаковки архивов. Вызываемый объект получает *base\_name* создаваемого файла, за которым следует *base\_dir* (по умолчанию [`os.curdir`](https://python-all.ru/3.7/library/os.html#os.curdir)), откуда начинается архивация. Дополнительные аргументы передаются как именованные: *owner*, *group*, *dry\_run* и *logger* (как передано в [`make_archive()`](https://python-all.ru/3.7/library/shutil.html#shutil.make_archive)).311312Если указан, *extra\_args* – это последовательность пар `(name, value)`, которые будут использоваться как дополнительные именованные аргументы при вызове архиватора.313314*description* используется [`get_archive_formats()`](https://python-all.ru/3.7/library/shutil.html#shutil.get_archive_formats), который возвращает список архиваторов. По умолчанию – пустая строка.315316#### `shutil.unregister_archive_format(name)`317318Удалите имя формата архива *name* из списка поддерживаемых форматов.319320#### `shutil.unpack_archive(filename[, extract_dir[, format]])`321322Распаковывает архив. *filename* – это полный путь к архиву.323324*extract\_dir* – имя целевой директории, в которую распаковывается архив. Если не указано, используется текущая рабочая директория.325326*format* – это формат архива: один из «zip», «tar», «gztar», «bztar» или «xztar». Или любой другой формат, зарегистрированный с помощью [`register_unpack_format()`](https://python-all.ru/3.7/library/shutil.html#shutil.register_unpack_format). Если формат не указан, [`unpack_archive()`](https://python-all.ru/3.7/library/shutil.html#shutil.unpack_archive) будет использовать расширение имени файла архива и проверит, зарегистрирован ли распаковщик для этого расширения. Если ничего не найдено, вызывается [`ValueError`](https://python-all.ru/3.7/library/exceptions.html#ValueError).327328Изменено в версии 3.7: Принимает [объект, подобный пути](https://python-all.ru/3.7/glossary.html#term-path-like-object) для *filename* и *extract\_dir*.329330#### `shutil.register_unpack_format(name, extensions, function[, extra_args[, description]])`331332Регистрирует формат распаковки. *name* – имя формата, а *extensions* – список расширений, соответствующих этому формату, например `.zip` для Zip-файлов.333334*function* – это вызываемый объект, который будет использоваться для распаковки архивов. Вызываемый объект будет получать путь к архиву, за которым следует каталог, в который необходимо извлечь архив.335336Если указано, *extra\_args* – это последовательность кортежей `(name, value)`, которые будут переданы в качестве именованных аргументов вызываемому объекту.337338*description* может быть указано для описания формата и будет возвращено функцией [`get_unpack_formats()`](https://python-all.ru/3.7/library/shutil.html#shutil.get_unpack_formats).339340#### `shutil.unregister_unpack_format(name)`341342Отменяет регистрацию формата распаковки. *name* – имя формата.343344#### `shutil.get_unpack_formats()`345346Возвращает список всех зарегистрированных форматов для распаковки. Каждый элемент возвращаемой последовательности является кортежем `(name, extensions, description)`.347348По умолчанию [`shutil`](https://python-all.ru/3.7/library/shutil.html#module-shutil) предоставляет следующие форматы:349350- *zip*: ZIP-файл (распаковка сжатых файлов работает, только если доступен соответствующий модуль).351- *tar*: несжатый tar-файл.352- *gztar*: tar-файл, сжатый gzip (если доступен модуль [`zlib`](https://python-all.ru/3.7/library/zlib.html#module-zlib)).353- *bztar*: tar-файл, сжатый bzip2 (если доступен модуль [`bz2`](https://python-all.ru/3.7/library/bz2.html#module-bz2)).354- *xztar*: tar-файл, сжатый xz (если доступен модуль [`lzma`](https://python-all.ru/3.7/library/lzma.html#module-lzma)).355356Вы можете зарегистрировать новые форматы или предоставить собственный распаковщик для любых существующих форматов, используя [`register_unpack_format()`](https://python-all.ru/3.7/library/shutil.html#shutil.register_unpack_format).357358### Пример архивации359360В этом примере мы создаём tar-архив, сжатый gzip, содержащий все файлы, найденные в каталоге `.ssh` пользователя:361362```python363>>> from shutil import make_archive364>>> import os365>>> archive_name = os.path.expanduser(os.path.join('~', 'myarchive'))366>>> root_dir = os.path.expanduser(os.path.join('~', '.ssh'))367>>> make_archive(archive_name, 'gztar', root_dir)368'/Users/tarek/myarchive.tar.gz'369```370371Полученный архив содержит:372373```console374$ tar -tzvf /Users/tarek/myarchive.tar.gz375drwx------ tarek/staff       0 2010-02-01 16:23:40 ./376-rw-r--r-- tarek/staff     609 2008-06-09 13:26:54 ./authorized_keys377-rwxr-xr-x tarek/staff      65 2008-06-09 13:26:54 ./config378-rwx------ tarek/staff     668 2008-06-09 13:26:54 ./id_dsa379-rwxr-xr-x tarek/staff     609 2008-06-09 13:26:54 ./id_dsa.pub380-rw------- tarek/staff    1675 2008-06-09 13:26:54 ./id_rsa381-rw-r--r-- tarek/staff     397 2008-06-09 13:26:54 ./id_rsa.pub382-rw-r--r-- tarek/staff   37192 2010-02-06 18:23:10 ./known_hosts383```384385### Пример архивации с *base\_dir*386387В этом примере, аналогичном [предыдущему](https://python-all.ru/3.7/library/shutil.html#shutil-archiving-example), показано, как использовать [`make_archive()`](https://python-all.ru/3.7/library/shutil.html#shutil.make_archive), но на этот раз с применением *base\_dir*. Теперь структура каталогов выглядит так:388389```console390$ tree tmp391tmp392└── root393    └── structure394        ├── content395            └── please_add.txt396        └── do_not_add.txt397```398399В итоговый архив должен быть включён `please_add.txt`, а `do_not_add.txt` – нет. Поэтому используется следующее:400401```python402>>> from shutil import make_archive403>>> import os404>>> archive_name = os.path.expanduser(os.path.join('~', 'myarchive'))405>>> make_archive(406...     archive_name,407...     'tar',408...     root_dir='tmp/root',409...     base_dir='structure/content',410... )411'/Users/tarek/my_archive.tar'412```413414Вывод списка файлов в полученном архиве даёт:415416```console417$ python -m tarfile -l /Users/tarek/myarchive.tar418structure/content/419structure/content/please_add.txt420```421422## Запрос размера выходного терминала423424#### `shutil.get_terminal_size(fallback=(columns, lines))`425426Получить размер окна терминала.427428Для каждого из двух измерений проверяется переменная окружения, соответственно `COLUMNS` и `LINES`. Если переменная определена и её значение – положительное целое число, оно используется.429430Если `COLUMNS` или `LINES` не определена (что бывает чаще всего), терминал, подключённый к [`sys.__stdout__`](https://python-all.ru/3.7/library/sys.html#sys.__stdout__), опрашивается с помощью вызова [`os.get_terminal_size()`](https://python-all.ru/3.7/library/os.html#os.get_terminal_size).431432Если размер терминала не удаётся опросить – либо из-за того, что система не поддерживает опрос, либо потому, что нет подключения к терминалу, – используется значение, указанное в параметре `fallback`. `fallback` по умолчанию равно `(80, 24)`, это размер, используемый по умолчанию многими эмуляторами терминала.433434Возвращаемое значение – именованный кортеж типа [`os.terminal_size`](https://python-all.ru/3.7/library/os.html#os.terminal_size).435436См. также: The Single UNIX Specification, Version 2, [Другие переменные окружения](https://python-all.ru/3.7/library/shutil.html).437438Новое в версии 3.3.439