Spec-Zone.ru › Python 3.11

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: Раньше вместо OSError возникало исключение IOError. Добавлен аргумент follow_symlinks. Теперь функция возвращает dst.

Изменено в версии 3.4: Вместо Error возникает исключение SameFileError. Поскольку первое является подклассом второго, это изменение обратно совместимо.

Изменено в версии 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(). Она игнорирует файлы и каталоги, соответствующие одному из заданных шаблонов 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.2: Добавлен аргумент copy_function, позволяющий указать пользовательскую функцию копирования. Добавлен аргумент ignore_dangling_symlinks, позволяющий подавлять ошибки о висячих символических ссылках, если symlinks имеет значение false.

Изменено в версии 3.3: При значении symlinks false копируются метаданные. Теперь функция возвращает dst.

Изменено в версии 3.8: Для повышения эффективности копирования файла могут использоваться системные вызовы быстрого копирования, специфичные для платформы. См. раздел Эффективные операции копирования, зависящие от платформы.

Изменено в версии 3.8: Добавлен параметр dirs_exist_ok.

shutil.rmtree(path, ignore_errors=False, onerror=None, *, dir_fd=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, dir_fd.

Изменено в версии 3.3: Добавлена защищённая от атак с использованием символических ссылок версия, которая автоматически используется, если платформа поддерживает функции на основе файловых дескрипторов.

Изменено в версии 3.8: В Windows содержимое точки соединения каталогов больше не удаляется перед удалением самой точки соединения.

Изменено в версии 3.11: Добавлен параметр dir_fd.

rmtree.avoids_symlink_attacks

Указывает, предоставляет ли текущая платформа и реализация версию rmtree(), защищённую от атак с использованием символических ссылок. В настоящее время это верно только для платформ, поддерживающих функции доступа к каталогам на основе файловых дескрипторов.

Добавлено в версии 3.3.

shutil.move(src, dst, copy_function=copy2)

Рекурсивно перемещает файл или каталог (src) в другое место и возвращает путь назначения.

Если dst — это существующий каталог или символическая ссылка на каталог, src перемещается внутрь этого каталога. Путь назначения в этом каталоге не должен уже существовать.

Если dst уже существует, но не является каталогом, он может быть перезаписан в зависимости от семантики os.rename().

Если место назначения находится в той же файловой системе, используется os.rename(). В противном случае src копируется в место назначения с помощью copy_function, а затем удаляется. В случае символических ссылок в месте назначения будет создана новая символическая ссылка, указывающая на цель src, после чего src будет удалён.

Если задан аргумент copy_function, он должен быть вызываемым объектом, принимающим два аргумента — src и путь назначения — и используемым для копирования src в место назначения, если нельзя использовать 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 может указывать на файл или каталог.

Примечание

В файловых системах 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.

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

exception shutil.Error

Это исключение объединяет исключения, возникающие при операциях с несколькими файлами. Для copytree() аргумент исключения представляет собой список троек (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 КиБ), а также вариант shutil.copyfileobj(), основанный на memoryview().

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

Изменено в версии 3.10.6: Эта функция теперь потокобезопасна при создании стандартных архивов .zip и tar.

shutil.get_archive_formats()

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

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

  • zip: ZIP-файл (если доступен модуль zlib).
  • tar: несжатый tar-файл. Для новых архивов используется формат POSIX.1-2001 pax.
  • gztar: tar-файл, сжатый gzip (если доступен модуль zlib).
  • bztar: tar-файл, сжатый bzip2 (если доступен модуль bz2).
  • xztar: tar-файл, сжатый xz (если доступен модуль 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.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().

Пример архивирования

В этом примере создается архив tar, сжатый gzip, содержащий все файлы, найденные в каталоге .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 Specification, версия 2, раздел Другие переменные окружения.

Добавлено в версии 3.3.

Изменено в версии 3.11: Значения fallback также используются, если os.get_terminal_size() возвращает нули.

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

Spec-Zone.ru

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