shutil — Операции с файлами высокого уровня
Исходный код: Lib/shutil.py
Модуль shutil предоставляет ряд операций высокого уровня над файлами и коллекциями файлов. В частности, предоставляются функции, которые поддерживают копирование и удаление файлов. Для операций с отдельными файлами также обратитесь к модулю os.
Предупреждение
Даже функции копирования файлов высокого уровня (shutil.copy(), shutil.copy2()) не могут скопировать все метаданные файла.
В системах POSIX это означает, что владелец и группа файла, а также ACL теряются. В Mac OS ресурсный вилка и другие метаданные не используются. Это означает, что ресурсы будут потеряны, а коды типа и создателя файла будут некорректны. В Windows не копируются владельцы файлов, ACL и альтернативные потоки данных.
Операции с каталогами и файлами
-
shutil.copyfileobj(fsrc, fdst[, length]) -
Копирует содержимое объекта-подобного файлу fsrc в объект-подобный файлу fdst. Целое число length, если задано, — размер буфера. В частности, отрицательное значение length означает копирование данных без циклического чтения данных из исходного файла по частям; по умолчанию данные читаются по частям, чтобы избежать неконтролируемого потребления памяти. Обратите внимание, что если текущая позиция файла объекта fsrc не равна 0, будут скопированы только данные от текущей позиции файла до конца файла.
-
shutil.copyfile(src, dst, *, follow_symlinks=True) -
Копирует содержимое (без метаданных) файла с именем src в файл с именем dst и возвращает dst наиболее эффективным способом. src и dst — объекты пути или имена путей, заданные в виде строк.
dst должен быть полным именем целевого файла; см.
copy()для копирования в целевой каталог. Если src и dst указывают на один и тот же файл, будет поднято исключениеSameFileError.Целевой путь должен быть доступен для записи; в противном случае будет поднято исключение
OSError. Если dst уже существует, он будет заменён. Специальные файлы, такие как символьные или блочные устройства и каналы, не могут быть скопированы с помощью этой функции.Если follow_symlinks равно false, а src — символическая ссылка, вместо копирования файла, на который указывает src, будет создана новая символическая ссылка.
Поднимает событие аудита
shutil.copyfileс аргументамиsrc,dst.Изменено в версии 3.3: Раньше использовалось исключение
IOErrorвместоOSError. Добавлен аргумент follow_symlinks. Теперь возвращается dst.Изменено в версии 3.4: Поднимается исключение
SameFileErrorвместоError. Поскольку первое является подклассом второго, это изменение совместимо с предыдущими версиями.Изменено в версии 3.8: Внутренне могут использоваться платформенно-специфические системные вызовы для быстрой копирования файлов для повышения эффективности. См. раздел "Платформенно-зависимые эффективные операции копирования".
-
exception shutil.SameFileError -
Это исключение поднимается, если исходный и целевой файлы в
copyfile()совпадают.Добавлен в версии 3.4.
-
shutil.copymode(src, dst, *, follow_symlinks=True) -
Копирует биты разрешений из src в dst. Содержимое, владелец и группа файла не затрагиваются. src и dst — объекты пути или имена путей, заданные в виде строк. Если follow_symlinks равно false, и оба src и dst — символические ссылки,
copymode()попытается изменить режим самого dst (а не файла, на который он указывает). Эта функциональность недоступна на всех платформах; см.copystat()для получения дополнительной информации. Еслиcopymode()не может изменить символические ссылки на локальной платформе, то ничего не делает и возвращает значение.Поднимает событие аудита
shutil.copymodeс аргументамиsrc,dst.Изменено в версии 3.3: Добавлен аргумент follow_symlinks.
-
shutil.copystat(src, dst, *, follow_symlinks=True) -
Копирует биты разрешений, время последнего доступа, время последнего изменения и флаги из src в dst. В Linux,
copystat()также копирует «расширенные атрибуты», где это возможно. Содержимое, владелец и группа файла не затрагиваются. src и dst — объекты пути или имена путей, заданные в виде строк.Если follow_symlinks равно false, и оба src и dst — символические ссылки,
copystat()будет работать с самими символическими ссылками, а не с файлами, на которые они указывают — читая информацию из символической ссылки src и записывая информацию в символическую ссылку dst.Примечание
Не все платформы обеспечивают возможность проверки и изменения символических ссылок. Сам Python может сообщить вам о доступной функциональности.
- Если
os.chmod in os.supports_follow_symlinksравноTrue,copystat()может изменить биты разрешений символической ссылки. - Если
os.utime in os.supports_follow_symlinksравноTrue,copystat()может изменить время последнего доступа и последнего изменения символической ссылки. - Если
os.chflags in os.supports_follow_symlinksравноTrue,copystat()может изменить флаги символической ссылки. (os.chflagsнедоступно на всех платформах.)
На платформах, где некоторые или все эти функции недоступны, при попытке изменить символическую ссылку,
copystat()скопирует всё, что может.copystat()никогда не возвращает ошибку.См.
os.supports_follow_symlinksдля получения дополнительной информации.Поднимает событие аудита
shutil.copystatс аргументамиsrc,dst.Изменено в версии 3.3: Добавлен аргумент follow_symlinks и поддержка расширенных атрибутов Linux.
- Если
-
shutil.copy(src, dst, *, follow_symlinks=True) -
Копирует файл src в файл или каталог dst. src и dst должны быть объектами пути или строками. Если dst задаёт каталог, файл будет скопирован в dst с использованием базового имени файла из src. Если dst задаёт файл, который уже существует, он будет заменён. Возвращает путь к новосозданному файлу.
Если follow_symlinks равно false, и src — символическая ссылка, dst будет создан как символическая ссылка. Если follow_symlinks равно true, и src — символическая ссылка, dst будет копией файла, на который указывает src.
copy()копирует данные файла и режим разрешений файла (см.os.chmod()). Другие метаданные, такие как время создания и изменения файла, не сохраняются. Чтобы сохранить все метаданные файла из оригинала, используйтеcopy2()вместо этого.Поднимает событие аудита
shutil.copyfileс аргументамиsrc,dst.Поднимает событие аудита
shutil.copymodeс аргументамиsrc,dst.Изменено в версии 3.3: Добавлен аргумент follow_symlinks. Теперь возвращается путь к новосозданному файлу.
Изменено в версии 3.8: Внутренне могут использоваться платформенно-специфические системные вызовы для быстрой копирования файлов для повышения эффективности. См. раздел "Платформенно-зависимые эффективные операции копирования".
-
shutil.copy2(src, dst, *, follow_symlinks=True) -
Идентично
copy(), за исключением того, чтоcopy2()также пытается сохранить метаданные файла.Когда follow_symlinks имеет значение false, а src — это символическая ссылка,
copy2()пытается скопировать все метаданные из символической ссылки src в новую символическую ссылку dst. Однако эта функциональность не доступна на всех платформах. На платформах, где часть или вся эта функциональность недоступна,copy2()сохранит все метаданные, которые сможет;copy2()никогда не вызывает исключение из-за невозможности сохранить метаданные файла.copy2()используетcopystat()для копирования метаданных файла. Подробнее о поддержке изменения метаданных символических ссылок на различных платформах см. в разделеcopystat().Вызывает событие аудита
shutil.copyfileс аргументамиsrc,dst.Вызывает событие аудита
shutil.copystatс аргументамиsrc,dst.Изменено в версии 3.3: Добавлен аргумент follow_symlinks, попытка скопировать расширенные атрибуты файловой системы также (пока только Linux). Теперь возвращает путь к новосозданному файлу.
Изменено в версии 3.8: Внутренне могут использоваться платформенно-зависимые быстродействующие вызовы систем для более эффективного копирования файла. См. раздел Платформенно-зависимые эффективные операции копирования.
-
shutil.ignore_patterns(*patterns) -
Эта фабричная функция создает функцию, которая может использоваться в качестве вызываемого объекта для аргумента ignore у
copytree(), игнорируя файлы и каталоги, соответствующие одному из указанных шаблонов в стиле glob. См. пример ниже.
-
shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False, dirs_exist_ok=False) -
Рекурсивно копирует всю древовидную структуру каталога, укоренённую в src, в каталог с именем dst и возвращает целевой каталог. По умолчанию также создаются все промежуточные каталоги, необходимые для размещения dst.
Права доступа и время каталогов копируются с помощью
copystat(), отдельные файлы копируются с помощьюcopy2().Если symlinks имеет значение true, символические ссылки в исходном дереве представлены как символические ссылки в новом дереве, а метаданные исходных ссылок копируются в той мере, в какой это позволяет платформа; если false или опущено, содержимое и метаданные связанных файлов копируются в новое дерево.
Когда symlinks имеет значение false, если файл, на который указывает символическая ссылка, не существует, в список ошибок, поднятых исключением
Errorв конце процесса копирования, будет добавлено исключение. Вы можете установить необязательный флаг ignore_dangling_symlinks в значение true, если хотите отключить это исключение. Обратите внимание, что этот параметр не имеет эффекта на платформах, не поддерживающихos.symlink().Если указан ignore, он должен быть вызываемым объектом, который будет получать в качестве аргументов каталог, посещаемый функцией
copytree(), и список его содержимого, возвращаемый функциейos.listdir(). Посколькуcopytree()вызывается рекурсивно, вызываемый объект ignore будет вызываться один раз для каждого копируемого каталога. Вызываемый объект должен возвращать последовательность имён каталогов и файлов, относящихся к текущему каталогу (т.е. подмножество элементов во втором аргументе); эти имена будут игнорироваться в процессе копирования.ignore_patterns()может использоваться для создания такого вызываемого объекта, который игнорирует имена на основе шаблонов в стиле glob.Если произойдёт исключение(я), возникает исключение
Errorсо списком причин.Если задан copy_function, он должен быть вызываемым объектом, который будет использоваться для копирования каждого файла. Он будет вызываться с путями к исходному и целевому файлам в качестве аргументов. По умолчанию используется
copy2(), но может использоваться любая функция, поддерживающая ту же сигнатуру (например,copy()).Если dirs_exist_ok имеет значение false (по умолчанию) и dst уже существует, возникает исключение
FileExistsError. Если dirs_exist_ok имеет значение true, операция копирования будет продолжена, если она столкнётся с существующими каталогами, и файлы внутри дерева dst будут перезаписаны соответствующими файлами из дерева src.Вызывает событие аудита
shutil.copytreeс аргументамиsrc,dst.Изменено в версии 3.3: Копирование метаданных, когда symlinks имеет значение false. Теперь возвращает dst.
Изменено в версии 3.2: Добавлен аргумент copy_function для возможности предоставления пользовательской функции копирования. Добавлено аргумент ignore_dangling_symlinks для предотвращения ошибок при наличии висячих ссылок, когда symlinks имеет значение false.
Изменено в версии 3.8: Внутренне могут использоваться платформенно-зависимые быстродействующие вызовы систем для более эффективного копирования файла. См. раздел Платформенно-зависимые эффективные операции копирования.
Добавлена в версии 3.8: Параметр dirs_exist_ok.
-
shutil.rmtree(path, ignore_errors=False, onerror=None, *, dir_fd=None) -
Удаляет всю древовидную структуру каталога; path должен указывать на каталог (но не на символическую ссылку на каталог). Если ignore_errors имеет значение true, ошибки, возникающие из-за неудачных удалений, игнорируются; если false или опущено, такие ошибки обрабатываются вызовом обработчика, указанного параметром onerror, или, если он опушен, вызывают исключение.
Эта функция может поддерживать пути, относящиеся к дескрипторам каталогов.
Примечание
На платформах, поддерживающих необходимые функции на основе fd, по умолчанию используется защищённая от атак с использованием символических ссылок версия функции
rmtree(). На других платформах реализацияrmtree()уязвима для атак с использованием символических ссылок: при определённых условиях и времени злоумышленники могут манипулировать символическими ссылками в файловой системе для удаления файлов, к которым они иначе не имеют доступа. Приложения могут использовать атрибут функцииrmtree.avoids_symlink_attacks, чтобы определить, какой случай применим.Если указан onerror, он должен быть вызываемым объектом, принимающим три параметра: function, path и excinfo.
Первый параметр, function, — это функция, которая вызвала исключение; он зависит от платформы и реализации. Второй параметр, path, — это имя пути, переданное в function. Третий параметр, excinfo, — это информация об исключении, возвращаемая
sys.exc_info(). Исключения, поднятые функцией onerror, не будут перехвачены.Вызывает событие аудита
shutil.rmtreeс аргументамиpath,dir_fd.Изменено в версии 3.3: Добавлена версия, защищённая от атак с использованием символических ссылок, которая используется автоматически, если платформа поддерживает функции на основе fd.
Изменено в версии 3.8: В Windows больше не удаляет содержимое каталога соединения перед удалением соединения.
Изменено в версии 3.11: Параметр dir_fd.
-
rmtree.avoids_symlink_attacks -
Указывает, предоставляет ли текущая платформа и реализация защищённую от атак с использованием символических ссылок версию функции
rmtree(). В настоящее время это верно только для платформ, поддерживающих функции доступа к каталогам на основе fd.Добавлена в версии 3.3.
-
-
shutil.move(src, dst, copy_function=copy2) -
Рекурсивно перемещает файл или директорию (src) в другое место (dst) и возвращает место назначения.
Если место назначения — это существующая директория, то src перемещается внутрь этой директории. Если место назначения уже существует, но не является директорией, то оно может быть перезаписано в зависимости от семантики
os.rename().Если место назначения находится на текущей файловой системе, то используется
os.rename(). В противном случае src копируется в dst с помощью copy_function, а затем удаляется. В случае с символическими ссылками будет создана новая символическая ссылка, указывающая на целевой объект src в dst, и src будет удалено.Если задан copy_function, он должен быть вызываемым объектом, принимающим два аргумента src и dst, и будет использован для копирования src в dst, если
os.rename()не может быть использован. Если исходный объект — директория, вызываетсяcopytree(), передавая ему copy_function. По умолчанию copy_function —copy2(). Использованиеcopy()в качестве copy_function позволяет перемещению успешно завершиться, когда невозможно скопировать также метаданные, за счёт того, что не копируются никакие метаданные.Вызывает событие аудита аудита
shutil.moveс аргументамиsrc,dst.Изменено в версии 3.3: Добавлена явная обработка символических ссылок для внешних файловых систем, тем самым адаптируя её к поведению GNU's mv. Теперь возвращает dst.
Изменено в версии 3.5: Добавлен ключевой аргумент copy_function.
Изменено в версии 3.8: Внутренне могут использоваться платформенно-специфичные системные вызовы для быстрой копирования файлов, чтобы сделать копирование более эффективным. См. раздел Платформенно-зависимые эффективные операции копирования.
Изменено в версии 3.9: Принимает объект-путь для src и dst.
-
shutil.disk_usage(path) -
Возвращает статистику использования диска для заданного пути в виде именованной кортежи с атрибутами total, used и free, которые представляют собой объём общего, используемого и свободного пространства в байтах. path может быть файлом или директорией.
Примечание
В Unix-системах path должен указывать на путь внутри подключённого раздела файловой системы. В этих платформах CPython не пытается получить информацию об использовании диска с недоступных файловых систем.
Новая в версии 3.3.
Изменено в версии 3.8: В Windows path теперь может быть файлом или директорией.
Доступность: Unix, Windows.
-
shutil.chown(path, user=None, group=None) -
Изменяет владельца user и/или группу group заданного пути path.
user может быть именем системного пользователя или uid; то же самое относится к group. Требуется хотя бы один аргумент.
См. также
os.chown(), базовую функцию.Вызывает событие аудита аудита
shutil.chownс аргументамиpath,user,group.Доступность: Unix.
Новая в версии 3.3.
-
shutil.which(cmd, mode=os.F_OK | os.X_OK, path=None) -
Возвращает путь к исполняемому файлу, который будет запущен, если вызвать заданную команду cmd. Если по cmd не будет выполнено ничего, вернуть
None.mode — маска прав доступа, передаваемая в
os.access(), по умолчанию определяющая существование и исполняемость файла.При отсутствии указанного path используются результаты
os.environ(), возвращая либо значение «PATH», либо резервный вариантos.defpath.В Windows текущий каталог всегда добавляется к path, независимо от того, используете ли вы значение по умолчанию или свой собственный, что соответствует поведению командной оболочки при поиске исполняемых файлов. Кроме того, при поиске cmd в path проверяется переменная окружения
PATHEXT. Например, если вы вызываетеshutil.which("python"),which()будет искатьPATHEXTдля того, чтобы знать, что должно искатьpython.exeв каталогах path. Например, в Windows:>>> shutil.which("python") 'C:\\Python33\\python.EXE'Новая в версии 3.3.
-
exception shutil.Error -
Эта исключение собирает исключения, возникающие во время многофайловой операции. Для
copytree(), аргумент исключения — список из 3-кортежей (srcname, dstname, exception).
Платформенно-зависимые эффективные операции копирования
Начиная с Python 3.8, все функции, включающие копирование файла (copyfile(), copy(), copy2(), copytree() и move()) могут использовать платформенно-специфические системные вызовы для более эффективного копирования файла (см. bpo-33671). «Быстрое копирование» означает, что операция копирования происходит в ядре, избегая использования буферов пользователя в Python, как в «outfd.write(infd.read())».
В macOS используется fcopyfile для копирования содержимого файла (не метаданных).
В Linux используется os.sendfile().
В Windows shutil.copyfile() использует больший буфер по умолчанию (1 МБ вместо 64 КБ) и используется вариант memoryview()-based функции shutil.copyfileobj().
Если операция быстрого копирования завершается неудачно, и в целевом файле не было записано данных, то shutil молча переключается на использование менее эффективной функции copyfileobj() внутри.
Изменено в версии 3.8.
Пример copytree
Пример, использующий вспомогательную функцию ignore_patterns():
from shutil import copytree, ignore_patterns
copytree(source, destination, ignore=ignore_patterns('*.pyc', 'tmp*'))
Это скопирует всё, кроме файлов .pyc и файлов или директорий, чьё имя начинается с tmp.
Другой пример, использующий аргумент ignore для добавления вызова регистрации:
from shutil import copytree
import logging
def _logpath(path, names):
logging.info('Working in %s', path)
return [] # nothing will be ignored
copytree(source, destination, ignore=_logpath)
Пример rmtree
Этот пример показывает, как удалить древовидную структуру каталогов в Windows, где некоторые файлы имеют установленный бит только для чтения. Он использует обратный вызов onerror для сброса бита только для чтения и повторной попытки удаления. Любое последующее неудачное удаление будет передано дальше.
import os, stat
import shutil
def remove_readonly(func, path, _):
"Clear the readonly bit and reattempt the removal"
os.chmod(path, stat.S_IWRITE)
func(path)
shutil.rmtree(directory, onerror=remove_readonly)
Операции архивирования
Новая в версии 3.2.
Изменено в версии 3.5: Добавлена поддержка формата xztar.
Также предоставляются высокоуровневые утилиты для создания и чтения сжатых и архивированных файлов. Они опираются на модули zipfile и tarfile.
-
shutil.make_archive(base_name, format[, root_dir[, base_dir[, verbose[, dry_run[, owner[, group[, logger]]]]]]]) -
Создать архивный файл (например, zip или tar) и вернуть его имя.
base_name — имя создаваемого файла, включая путь, за исключением расширения, специфичного для формата. format — формат архива: один из “zip” (если модуль
zlibдоступен), “tar”, “gztar” (если модульzlibдоступен), “bztar” (если модульbz2доступен) или “xztar” (если модульlzmaдоступен).root_dir — каталог, который будет корневым каталогом архива; все пути в архиве будут относительными к нему; например, мы обычно переходим в root_dir перед созданием архива.
base_dir — каталог, с которого начинается архивирование; т. е. base_dir будет общим префиксом всех файлов и каталогов в архиве. base_dir должен быть задан относительно root_dir. См. Пример архивирования с base_dir, чтобы узнать, как использовать base_dir и root_dir вместе.
root_dir и base_dir по умолчанию устанавливаются в текущий каталог.
Если dry_run равно true, архив не создается, но операции, которые должны быть выполнены, записываются в logger.
owner и group используются при создании архива tar. По умолчанию используются текущий владелец и группа.
logger должен быть объектом, совместимым с PEP 282, обычно экземпляром
logging.Logger.Аргумент verbose не используется и устарел.
Вызывает событие аудита
shutil.make_archiveс аргументамиbase_name,format,root_dir,base_dir.Примечание
Эта функция не потокобезопасна, когда используются пользовательские архиваторы, зарегистрированные с помощью
register_archive_format(). В этом случае она временно изменяет текущую рабочую директорию процесса для выполнения архивации.Изменено в версии 3.8: Современный формат pax (POSIX.1-2001) теперь используется вместо устаревшего формата GNU для архивов, созданных с помощью
format="tar".Изменено в версии 3.10.6: Эта функция теперь потокобезопасна при создании стандартных
.zipи tar-архивов.
-
shutil.get_archive_formats() -
Возвращает список поддерживаемых форматов архивации. Каждый элемент возвращаемой последовательности — это кортеж
(name, description).По умолчанию
shutilпредоставляет следующие форматы:-
zip: ZIP-файл (если модуль
zlibдоступен). - tar: Несжатый tar-файл. Использует формат pax POSIX.1-2001 для новых архивов.
-
gztar: gzip-архив tar-файла (если модуль
zlibдоступен). -
bztar: bzip2-архив tar-файла (если модуль
bz2доступен). -
xztar: xz-архив tar-файла (если модуль
lzmaдоступен).
Вы можете регистрировать новые форматы или предоставлять свой собственный архиватор для любых существующих форматов, используя
register_archive_format(). -
zip: ZIP-файл (если модуль
-
shutil.register_archive_format(name, function[, extra_args[, description]]) -
Регистрирует архиватор для формата name.
function — вызываемый объект, который будет использоваться для распаковки архивов. Вызываемый объект получит base_name создаваемого файла, за которым следует base_dir (по умолчанию
os.curdir) для начала архивирования. Дополнительные аргументы передаются в виде ключевых аргументов: owner, group, dry_run и logger (как передано вmake_archive()).Если задано, extra_args — последовательность пар
(name, value)(ключ-значение), которые будут использоваться в качестве дополнительных ключевых аргументов при использовании вызываемого объекта архиватора.description используется функцией
get_archive_formats(), которая возвращает список архиваторов. По умолчанию пустая строка.
-
shutil.unregister_archive_format(name) -
Удаляет формат архива name из списка поддерживаемых форматов.
-
shutil.unpack_archive(filename[, extract_dir[, format[, filter]]]) -
Распаковывает архив. filename — полный путь к архиву.
extract_dir — имя целевого каталога, куда будет распакован архив. Если не указан, используется текущий рабочий каталог.
format — формат архива: один из “zip”, “tar”, “gztar”, “bztar” или “xztar”. Или любой другой формат, зарегистрированный с помощью
register_unpack_format(). Если не указан,unpack_archive()использует расширение имени архива и проверяет, зарегистрирован ли распаковщик для этого расширения. Если такового не найдено, генерируетсяValueError.Ключевой аргумент filter, добавленный в Python 3.11.4, передается в функцию распаковки. Для zip-файлов filter не принимается. Для tar-файлов рекомендуется установить его в
'data', если не используются функции, специфичные для tar и системных файлов UNIX. (Подробности см. в фильтрах извлечения.) Фильтр'data'станет по умолчанию для tar-файлов в Python 3.14.Вызывает событие аудита
shutil.unpack_archiveс аргументамиfilename,extract_dir,format.Предупреждение
Никогда не распаковывайте архивы из ненадежных источников без предварительного осмотра. Возможно, файлы создаются вне пути, указанного в аргументе extract_dir, например, члены с абсолютными именами файлов, начинающимися с «/», или имена файлов с двумя точками «..».
Изменено в версии 3.7: Принимает объект-путь для filename и extract_dir.
Изменено в версии 3.11.4: Добавлен аргумент filter.
-
shutil.register_unpack_format(name, extensions, function[, extra_args[, description]]) -
Регистрирует формат распаковки. name — имя формата, а extensions — список расширений, соответствующих формату, например,
.zipдля Zip-файлов.function — вызываемый объект, который будет использоваться для распаковки архивов. Вызываемый объект получит:
- путь к архиву в качестве позиционного аргумента;
- каталог, в который должен быть распакован архив, в качестве позиционного аргумента;
- возможно, ключевой аргумент filter, если он был задан в
unpack_archive(); - дополнительные ключевые аргументы, заданные в extra_args как последовательность
(name, value)кортежей.
description может быть предоставлен для описания формата и будет возвращен функцией
get_unpack_formats().
-
shutil.unregister_unpack_format(name) -
Удаляет зарегистрированный формат распаковки. name — имя формата.
-
shutil.get_unpack_formats() -
Возвращает список всех зарегистрированных форматов для распаковки. Каждый элемент возвращаемой последовательности — кортеж
(name, extensions, description).По умолчанию
shutilпредоставляет следующие форматы:- zip: архив ZIP (распаковка сжатых файлов работает только если соответствующий модуль доступен).
- tar: неархивированный файл tar.
-
gztar: файл tar, сжатый gzip (если модуль
zlibдоступен). -
bztar: файл tar, сжатый bzip2 (если модуль
bz2доступен). -
xztar: файл tar, сжатый xz (если модуль
lzmaдоступен).
Вы можете зарегистрировать новые форматы или предоставить свой распаковщик для любого из существующих форматов, используя
register_unpack_format().
Пример архивирования
В этом примере мы создаём архив gzip’ed tar, содержащий все файлы, найденные в каталоге .ssh пользователя:
>>> from shutil import make_archive
>>> import os
>>> archive_name = os.path.expanduser(os.path.join('~', 'myarchive'))
>>> root_dir = os.path.expanduser(os.path.join('~', '.ssh'))
>>> make_archive(archive_name, 'gztar', root_dir)
'/Users/tarek/myarchive.tar.gz'
Получившийся архив содержит:
$ tar -tzvf /Users/tarek/myarchive.tar.gz drwx------ tarek/staff 0 2010-02-01 16:23:40 ./ -rw-r--r-- tarek/staff 609 2008-06-09 13:26:54 ./authorized_keys -rwxr-xr-x tarek/staff 65 2008-06-09 13:26:54 ./config -rwx------ tarek/staff 668 2008-06-09 13:26:54 ./id_dsa -rwxr-xr-x tarek/staff 609 2008-06-09 13:26:54 ./id_dsa.pub -rw------- tarek/staff 1675 2008-06-09 13:26:54 ./id_rsa -rw-r--r-- tarek/staff 397 2008-06-09 13:26:54 ./id_rsa.pub -rw-r--r-- tarek/staff 37192 2010-02-06 18:23:10 ./known_hosts
Пример архивирования с base_dir
В этом примере, аналогичном предыдущему, мы показываем, как использовать make_archive(), но на этот раз с использованием base_dir. Теперь у нас есть следующая структура каталогов:
$ tree tmp
tmp
└── root
└── structure
├── content
└── please_add.txt
└── do_not_add.txt
В итоговом архиве должен быть включён please_add.txt, но do_not_add.txt — нет. Поэтому мы используем следующее:
>>> from shutil import make_archive
>>> import os
>>> archive_name = os.path.expanduser(os.path.join('~', 'myarchive'))
>>> make_archive(
... archive_name,
... 'tar',
... root_dir='tmp/root',
... base_dir='structure/content',
... )
'/Users/tarek/my_archive.tar'
Список файлов в итоговом архиве:
$ python -m tarfile -l /Users/tarek/myarchive.tar structure/content/ structure/content/please_add.txt
Получение размера выходного терминала
-
shutil.get_terminal_size(fallback=(columns, lines)) -
Получить размер окна терминала.
Для каждой из двух размерностей проверяется переменная окружения, соответственно
COLUMNSиLINES. Если переменная определена и значение является положительным целым числом, оно используется.Если
COLUMNSилиLINESне определены, что является распространённым случаем, запрашивается размер терминала, подключённого кsys.__stdout__, вызываяos.get_terminal_size().Если размер терминала невозможно успешно запросить, либо потому что система не поддерживает запрос, либо потому что мы не подключены к терминалу, используется значение, заданное в параметре
fallback. Значение по умолчанию дляfallback—(80, 24), что является стандартным размером, используемым многими эмуляторами терминалов.Возвращаемое значение — именованный кортеж типа
os.terminal_size.См. также: Спецификация Single UNIX, версия 2, Другие переменные окружения.
Новое в версии 3.3.
Изменено в версии 3.11: Значения из
fallbackтакже используются, еслиos.get_terminal_size()возвращает нули.
© 2001–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/library/shutil.html