shutil — Операции с файлами высокого уровня
Исходный код: Lib/shutil.py
Модуль shutil предлагает ряд операций высокого уровня над файлами и коллекциями файлов. В частности, предоставляются функции, поддерживающие копирование и удаление файлов. Для операций с отдельными файлами также см. модуль os.
Предупреждение
Даже функции копирования файлов высокого уровня (shutil.copy(), shutil.copy2()) не могут скопировать всю метаданные файла.
В платформах POSIX это означает, что теряются владелец и группа файла, а также разрешения доступа. В Mac OS не используются ресурсная вилка и другие метаданные. Это означает, что ресурсы будут потеряны, и коды типа и создателя файла не будут правильными. В Windows не копируются владельцы файлов, разрешения доступа и альтернативные потоки данных.
Операции с каталогами и файлами
-
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 ложно и 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 ложно, и 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 ложно, и 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. Возвращает путь к новосозданному файлу.
Если follow_symlinks ложно и src — символическая ссылка, dst будет создан как символическая ссылка. Если follow_symlinks истинно и 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 ложно, и 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, указанных в patterns. См. пример ниже.
-
shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False, dirs_exist_ok=False) -
Рекурсивно копирует всю иерархию каталогов, корень которой находится в src, в каталог под именем dst и возвращает целевой каталог. dirs_exist_ok указывает, следует ли вызывать исключение в случае, если dst или любой отсутствующий родительский каталог уже существует.
Права и время изменения каталогов копируются с помощью
copystat(), отдельные файлы копируются с помощьюcopy2().Если symlinks истинно, символические ссылки в исходном дереве представлены как символические ссылки в новом дереве, и метаданные исходных ссылок копируются по мере возможности платформы; если ложно или опущено, содержимое и метаданные связанных файлов копируются в новое дерево.
Когда symlinks ложно, если файл, на который указывает символическая ссылка, не существует, исключение будет добавлено в список исключений, поднятых в исключении
Errorв конце процесса копирования. Вы можете установить необязательный флаг ignore_dangling_symlinks в значение true, если хотите отключить это исключение. Обратите внимание, что этот параметр не влияет на платформы, которые не поддерживаютos.symlink().Если указан ignore, он должен быть вызываемым объектом, который будет получать в качестве аргументов каталог, посещаемый
copytree(), и список его содержимого, как возвращаетсяos.listdir(). Посколькуcopytree()вызывается рекурсивно, вызываемый объект ignore будет вызываться один раз для каждого каталога, который копируется. Вызываемый объект должен возвращать последовательность имен каталогов и файлов относительно текущего каталога (т.е. подмножество элементов во втором аргументе); эти имена будут игнорироваться в процессе копирования.ignore_patterns()можно использовать для создания такого вызываемого объекта, который игнорирует имена на основе шаблонов glob.Если произойдут исключения, будет поднято исключение
Errorсо списком причин.Если задан copy_function, он должен быть вызываемым объектом, который будет использоваться для копирования каждого файла. Он будет вызываться с исходным путём и путём назначения в качестве аргументов. По умолчанию используется
copy2(), но может использоваться любая функция, поддерживающая такую же сигнатуру (например,copy()).Вызывает событие аудита
shutil.copytreeс аргументамиsrc,dst.Изменено в версии 3.3: Копирование метаданных, когда symlinks ложно. Теперь возвращает dst.
Изменено в версии 3.2: Добавлен аргумент copy_function для возможности предоставления пользовательской функции копирования. Добавлена аргумент ignore_dangling_symlinks для отключения исключений повисших символических ссылок при symlinks ложно.
Изменено в версии 3.8: Возможно использование платформозависимых системных вызовов для быстрого копирования для более эффективного копирования файла. См. раздел «Платформозависимые эффективные операции копирования».
Новое в версии 3.8: Параметр dirs_exist_ok.
-
shutil.rmtree(path, ignore_errors=False, onerror=None) -
Удаляет всю иерархию каталогов; path должен указывать на каталог (но не на символическую ссылку на каталог). Если ignore_errors истинно, ошибки, возникшие в результате неудаленных удалений, игнорируются; если ложно или опущено, такие ошибки обрабатываются вызовом обработчика, указанного в onerror или, если он опущен, они вызывают исключение.
Примечание
На платформах, которые поддерживают необходимые функции, основанные на дескрипторах файлов, по умолчанию используется устойчивая к атакам с помощью символических ссылок версия
rmtree(). На других платформах реализацияrmtree()уязвима к атакам с использованием символических ссылок: при правильном времени и обстоятельствах злоумышленники могут манипулировать символическими ссылками в файловой системе, чтобы удалить файлы, к которым они не имеют доступа. Приложения могут использовать атрибут функцииrmtree.avoids_symlink_attacksдля определения того, какой случай применяется.Если задан onerror, он должен быть вызываемым объектом, принимающим три параметра: function, path и excinfo.
Первый параметр, function, — это функция, которая вызвала исключение; он зависит от платформы и реализации. Второй параметр, path, — это имя пути, переданное в function. Третий параметр, excinfo, — это информация об исключении, возвращаемая
sys.exc_info(). Исключения, вызванные onerror, не будут перехвачены.Вызывает событие аудита
shutil.rmtreeс аргументомpath.Изменено в версии 3.3: Добавлена версия, устойчивая к атакам с использованием символических ссылок, которая автоматически используется, если платформа поддерживает функции, основанные на дескрипторах файлов.
Изменено в версии 3.8: В Windows больше не будет удалено содержимое каталога-соединения перед удалением соединения.
-
rmtree.avoids_symlink_attacks -
Указывает, предоставляет ли текущая платформа и реализация устойчивую к атакам с использованием символических ссылок версию
rmtree(). В настоящее время это истинно только для платформ, поддерживающих функции доступа к каталогам, основанные на дескрипторах файлов.Новое в версии 3.3.
-
-
shutil.move(src, dst, copy_function=copy2) -
Рекурсивно перемещает файл или директорию (src) в другое место (dst) и возвращает место назначения.
Если место назначения — существующая директория, то src перемещается внутрь этой директории. Если место назначения уже существует, но не является директорией, оно может быть перезаписано в зависимости от семантики
os.rename().Если место назначения находится на текущей файловой системе, то используется
os.rename(). В противном случае src копируется в dst с помощью copy_function, а затем удаляется. В случае с символическими ссылками будет создана новая символическая ссылка, указывающая на целевой объект src, в dst или как 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: Внутренне могут использоваться платформенно-специфичные быстрые системные вызовы для более эффективного копирования файла. См. раздел Платформенно-зависимые эффективные операции копирования.
-
shutil.disk_usage(path) -
Возвращает статистику использования дискового пространства по заданному пути как именованную кортеж с атрибутами total, used и free, представляющими объёмы общего, используемого и свободного места в байтах. path может быть файлом или директорией.
Новое в версии 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
В этом примере показана реализация функции copytree(), описанной выше, без документации. Он демонстрирует многие другие функции, предоставляемые этим модулем.
def copytree(src, dst, symlinks=False):
names = os.listdir(src)
os.makedirs(dst)
errors = []
for name in names:
srcname = os.path.join(src, name)
dstname = os.path.join(dst, name)
try:
if symlinks and os.path.islink(srcname):
linkto = os.readlink(srcname)
os.symlink(linkto, dstname)
elif os.path.isdir(srcname):
copytree(srcname, dstname, symlinks)
else:
copy2(srcname, dstname)
# XXX What about devices, sockets etc.?
except OSError as why:
errors.append((srcname, dstname, str(why)))
# catch the Error from the recursive copytree so that we can
# continue with other files
except Error as err:
errors.extend(err.args[0])
try:
copystat(src, dst)
except OSError as why:
# can't copy file access times on Windows
if why.winerror is None:
errors.extend((src, dst, str(why)))
if errors:
raise Error(errors)
Ещё один пример, использующий вспомогательную функцию 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 не используется и устарел.
Вызывает событие аудита auditing event
shutil.make_archiveс аргументамиbase_name,format,root_dir,base_dir.Примечание
Эта функция не потокобезопасна.
Изменено в версии 3.8: Теперь используется современный формат pax (POSIX.1-2001) вместо устаревшего формата GNU для архивов, созданных с помощью
format="tar".
-
shutil.get_archive_formats() -
Возвращает список поддерживаемых форматов архивирования. Каждый элемент возвращаемой последовательности — это кортеж
(name, description).По умолчанию
shutilпредоставляет следующие форматы:-
zip: ZIP-файл (если доступен модуль
zlib). - tar: Несжатый tar-файл. Использует формат POSIX.1-2001 pax для новых архивов.
-
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]]) -
Распаковывает архив. filename — полный путь к архиву.
extract_dir — имя целевого каталога, куда распаковывается архив. Если не указано, используется текущий рабочий каталог.
format — формат архива: один из “zip”, “tar”, “gztar”, “bztar” или “xztar”. Или любой другой формат, зарегистрированный с помощью
register_unpack_format(). Если не указано,unpack_archive()будет использовать расширение имени файла архива и посмотрит, был ли зарегистрирован распаковщик для этого расширения. Если таковой не найден, возникает исключениеValueError.Вызывает событие аудита auditing event
shutil.unpack_archiveс аргументамиfilename,extract_dir,format.Изменено в версии 3.7: Принимает path-like object для filename и extract_dir.
-
shutil.register_unpack_format(name, extensions, function[, extra_args[, description]]) -
Регистрирует формат распаковки. name — имя формата, а extensions — список расширений, соответствующих формату, например
.zipдля Zip-файлов.function — вызываемый объект, который будет использоваться для распаковки архивов. Вызываемый объект получит путь к архиву, а затем каталог, в который должен быть извлечен архив.
Если указано, 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: Сжатый gzip tar-файл (если доступен модуль
zlib). -
bztar: Сжатый bzip2 tar-файл (если доступен модуль
bz2). -
xztar: Сжатый xz tar-файл (если доступен модуль
lzma).
Вы можете зарегистрировать новые форматы или предоставить свой собственный распаковщик для любых существующих форматов, используя
register_unpack_format().
Пример архивирования
В этом примере мы создаем сжатый gzip 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.
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.8/library/shutil.html