Spec-Zone.ru › Python 3.10

shutil — Операции с файлами высокого уровня

Исходный код: Lib/shutil.py

Модуль shutil предоставляет ряд операций высокого уровня с файлами и коллекциями файлов. В частности, предоставляются функции, поддерживающие копирование и удаление файлов. Для операций с отдельными файлами см. также модуль os.

Предупреждение

Даже функции копирования файлов высокого уровня (shutil.copy(), shutil.copy2()) не могут скопировать все метаданные файла.

В системах POSIX это означает, что владелец и группа файла, а также ACLs теряются. В Mac OS ресурсный вилка и другие метаданные не используются. Это означает, что ресурсы будут потеряны, а коды типа и создателя файла не будут корректными. В Windows владельцы файлов, ACLs и альтернативные потоки данных не копируются.

Операции с каталогами и файлами

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() не может изменить символические ссылки на локальной платформе, и это требуется, ничего не будет сделано, и функция вернёт None.

Вызывает событие аудита аудита 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(), игнорируя файлы и каталоги, которые соответствуют одному из шаблонов patterns, заданных в стиле 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)

Удаляет всю древовидную структуру каталогов; path должен указывать на каталог (но не на символическую ссылку на каталог). Если ignore_errors равно true, ошибки, возникающие из-за неудаленных удалений, игнорируются; если false или опущен, такие ошибки обрабатываются вызовом обработчика, заданного параметром 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, а 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 mv. Теперь возвращает dst.

Изменено в версии 3.5: Добавлен ключевой аргумент copy_function.

Изменено в версии 3.8: Возможно использование платформозависимых быстрых системных вызовов для копирования файла более эффективно. См. раздел Платформозависимые эффективные операции копирования.

Изменено в версии 3.9: Принимает объект пути для src и dst.

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.

Изменено в версии 3.8: Теперь принимается тип bytes. Если тип cmd — bytes, тип результата также bytes.

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: Вместо устаревшего формата GNU для архивов, созданных с помощью format="tar", теперь используется современный формат pax (POSIX.1-2001).

Изменено в версии 3.10.6: Теперь функция потокобезопасна при создании стандартных .zip и 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().

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.10.12, передаётся в базовую функцию распаковки. Для 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.10.12: Добавлен аргумент 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 — имя формата.

END_OF_DOCUMENT_MARKER
shutil.get_unpack_formats()

Возвращает список всех зарегистрированных форматов для распаковки. Каждый элемент возвращаемого последовательности — кортеж (name, extensions, description).

По умолчанию shutil предоставляет следующие форматы:

  • zip: ZIP-архив (распаковка сжатых файлов работает только если соответствующий модуль доступен).
  • tar: неархивированный tar-файл.
  • gztar: gzip'ed tar-файл (если модуль zlib доступен).
  • bztar: bzip2'ed tar-файл (если модуль bz2 доступен).
  • xztar: xz'ed tar-файл (если модуль 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.

© 2001–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.10/library/shutil.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API