tarfile — Чтение и запись архивов tar
Исходный код: Lib/tarfile.py
Модуль tarfile позволяет читать и записывать архивы tar, включая архивы сжатые с помощью gzip, bz2 и lzma. Используйте модуль zipfile для чтения или записи файлов .zip, или функции высокого уровня в shutil.
Некоторые факты и цифры:
- читает и записывает сжатые архивы
gzip,bz2иlzma, если соответствующие модули доступны. - поддержка чтения/записи формата POSIX.1-1988 (ustar).
- поддержка чтения/записи формата GNU tar, включая расширения longname и longlink, поддержка только чтения для всех вариантов расширения sparse, включая восстановление разреженных файлов.
- поддержка чтения/записи формата POSIX.1-2001 (pax).
- обрабатывает каталоги, обычные файлы, жёсткие ссылки, символические ссылки, fifo, символьные и блочные устройства и может получить и восстановить информацию о файлах, такие как метка времени, разрешения доступа и владелец.
Изменено в версии 3.3: Добавлена поддержка сжатия lzma.
Изменено в версии 3.12: Архивы извлекаются с помощью фильтра, что позволяет либо ограничить неожиданные/опасные функции, либо признать, что они ожидаются, и архив полностью надёжен. По умолчанию архивы полностью надёжны, но этот параметр по умолчанию устарел и планируется изменить в Python 3.14.
-
tarfile.open(name=None, mode='r', fileobj=None, bufsize=10240, **kwargs) -
Возвращает объект
TarFileдля пути name. Для подробной информации об объектахTarFileи разрешённых ключевых аргументах, см. Объекты TarFile.mode должен быть строкой вида
'filemode[:compression]', по умолчанию'r'. Вот полный список комбинаций режимов:режим
действие
'r' or 'r:*'Открыть для чтения с прозрачным сжатием (рекомендуется).
'r:'Открыть для чтения исключительно без сжатия.
'r:gz'Открыть для чтения со сжатием gzip.
'r:bz2'Открыть для чтения со сжатием bzip2.
'r:xz'Открыть для чтения со сжатием lzma.
'x'или'x:'Создать архив tar исключительно без сжатия. Вызвать исключение
FileExistsError, если он уже существует.'x:gz'Создать архив tar со сжатием gzip. Вызвать исключение
FileExistsError, если он уже существует.'x:bz2'Создать архив tar со сжатием bzip2. Вызвать исключение
FileExistsError, если он уже существует.'x:xz'Создать архив tar со сжатием lzma. Вызвать исключение
FileExistsError, если он уже существует.'a' or 'a:'Открыть для добавления без сжатия. Файл создаётся, если он не существует.
'w' or 'w:'Открыть для записи без сжатия.
'w:gz'Открыть для записи со сжатием gzip.
'w:bz2'Открыть для записи со сжатием bzip2.
'w:xz'Открыть для записи со сжатием lzma.
Обратите внимание, что
'a:gz','a:bz2'или'a:xz'невозможны. Если mode не подходит для открытия определённого (сжатого) файла для чтения, генерируетсяReadError. Используйте mode'r', чтобы избежать этого. Если метод сжатия не поддерживается, генерируетсяCompressionError.Если fileobj указан, он используется как альтернатива файлу, открытому в двоичном режиме для name. Предполагается, что он находится в позиции 0.
Для режимов
'w:gz','x:gz','w|gz','w:bz2','x:bz2','w|bz2',tarfile.open()принимает ключевой аргумент compresslevel (по умолчанию9) для указания уровня сжатия файла.Для режимов
'w:xz'и'x:xz',tarfile.open()принимает ключевой аргумент preset для указания уровня сжатия файла.Для специальных целей существует второй формат для mode:
'filemode|[compression]'.tarfile.open()вернёт объектTarFile, который обрабатывает данные как поток блоков. Случайный доступ к файлу не будет производиться. Если указано, fileobj может быть любым объектом, имеющим методread()илиwrite()(в зависимости от mode), работающий с байтами. bufsize указывает размер блока и по умолчанию равен20 * 512байтам. Используйте этот вариант в сочетании, например, сsys.stdin.buffer, сокетом или устройством ленты. Однако такой объектTarFileограничен тем, что не позволяет случайный доступ, см. Примеры. Текущие возможные режимы:Режим
Действие
'r|*'Открыть поток блоков tar для чтения с прозрачным сжатием.
'r|'Открыть поток нескомпрессированных блоков tar для чтения.
'r|gz'Открыть сжатый gzip поток для чтения.
'r|bz2'Открыть сжатый bzip2 поток для чтения.
'r|xz'Открыть сжатый lzma поток для чтения.
'w|'Открыть нескомпрессированный поток для записи.
'w|gz'Открыть сжатый gzip поток для записи.
'w|bz2'Открыть сжатый bzip2 поток для записи.
'w|xz'Открыть сжатый lzma поток для записи.
Изменено в версии 3.5: Добавлен режим
'x'(исключительное создание).Изменено в версии 3.6: Параметр name принимает объект, похожий на путь.
Изменено в версии 3.12: Ключевой аргумент compresslevel также работает для потоков.
- class tarfile.TarFile
-
Класс для чтения и записи архивов tar. Не используйте этот класс напрямую: используйте
tarfile.open()вместо этого. См. Объекты TarFile.
-
tarfile.is_tarfile(name) -
Возвращает
True, если name — это архивный файл в формате tar, который может быть прочитан модулемtarfile. name может быть строкой, файлом или файлоподобным объектом.Изменено в версии 3.9: Поддержка файлов и файлоподобных объектов.
Модуль tarfile определяет следующие исключения:
-
exception tarfile.TarError -
Базовый класс для всех исключений модуля
tarfile.
-
exception tarfile.ReadError -
Выбрасывается, когда архив tar не может быть обработан модулем
tarfileили является некорректным.
-
exception tarfile.CompressionError -
Выбрасывается, когда метод сжатия не поддерживается или данные не могут быть должным образом декодированы.
-
exception tarfile.StreamError -
Выбрасывается в случае ограничений, характерных для файлоподобных объектов
TarFile.
-
exception tarfile.ExtractError -
Выбрасывается при некритичных ошибках при использовании
TarFile.extract(), но только если значениеTarFile.errorlevel== 2.
-
exception tarfile.HeaderError -
Выбрасывается методом
TarInfo.frombuf(), если полученный буфер некорректен.
-
exception tarfile.FilterError -
Базовый класс для элементов, отклоненных фильтрами.
-
tarinfo -
Информация об элементе, который фильтр отказался извлечь, как объект TarInfo.
-
-
exception tarfile.AbsolutePathError -
Выбрасывается, чтобы отказаться от извлечения элемента с абсолютным путем.
-
exception tarfile.OutsideDestinationError -
Выбрасывается, чтобы отказаться от извлечения элемента за пределами целевой директории.
-
exception tarfile.SpecialFileError -
Выбрасывается, чтобы отказаться от извлечения специального файла (например, устройства или канала).
-
exception tarfile.AbsoluteLinkError -
Выбрасывается, чтобы отказаться от извлечения символьной ссылки с абсолютным путем.
-
exception tarfile.LinkOutsideDestinationError -
Выбрасывается, чтобы отказаться от извлечения символьной ссылки, указывающей за пределы целевой директории.
В модуле доступны следующие константы:
-
tarfile.ENCODING -
По умолчанию кодировка символов:
'utf-8'в Windows, иначе — значение, возвращаемое функциейsys.getfilesystemencoding().
-
tarfile.REGTYPE -
tarfile.AREGTYPE -
Регулярный файл
type.
-
tarfile.LNKTYPE -
Ссылка (внутри tar-файла)
type.
-
tarfile.SYMTYPE -
Символьная ссылка
type.
-
tarfile.CHRTYPE -
Специальное устройство типа символ
type.
-
tarfile.BLKTYPE -
Специальное устройство типа блок
type.
-
tarfile.DIRTYPE -
Директория
type.
-
tarfile.FIFOTYPE -
Специальное устройство типа FIFO
type.
-
tarfile.CONTTYPE -
Файл непрерывного типа
type.
-
tarfile.GNUTYPE_LONGNAME -
GNU tar — длинное имя
type.
-
tarfile.GNUTYPE_LONGLINK -
GNU tar — длинная ссылка
type.
-
tarfile.GNUTYPE_SPARSE -
GNU tar — разреженный файл
type.
Каждая из следующих констант определяет формат архива tar, который может создать модуль tarfile. Подробности см. в разделе Поддерживаемые форматы tar.
-
tarfile.USTAR_FORMAT -
Формат POSIX.1-1988 (ustar).
-
tarfile.GNU_FORMAT -
Формат GNU tar.
-
tarfile.PAX_FORMAT -
Формат POSIX.1-2001 (pax).
-
tarfile.DEFAULT_FORMAT -
Формат по умолчанию для создания архивов. В настоящее время это
PAX_FORMAT.Изменено в версии 3.8: Формат по умолчанию для новых архивов был изменён на
PAX_FORMATсGNU_FORMAT.
См. также
-
Modulezipfile -
Документация стандартного модуля
zipfile. - Операции архивирования
-
Документация более высоких уровней архивирования, предоставляемых стандартным модулем
shutil. - GNU tar руководство, Основной формат Tar
-
Документация для архивов tar, включая расширения GNU tar.
Объекты TarFile
Объект TarFile предоставляет интерфейс к архиву tar. Архив tar представляет собой последовательность блоков. Член архива (сохранённый файл) состоит из заголовочного блока, за которым следуют данные блоков. Файл может быть сохранён в архиве tar несколько раз. Каждый член архива представлен объектом TarInfo, см. Объекты TarInfo для получения подробностей.
Объект TarFile может использоваться как менеджер контекста в операторе with. Он будет автоматически закрыт по завершении блока. Обратите внимание, что в случае возникновения исключения, открытый для записи архив не будет завершён; только внутренний используемый объект файла будет закрыт. См. раздел Примеры для примера использования.
Добавлен в версии 3.2: Добавлена поддержка протокола управления контекстом.
-
class tarfile.TarFile(name=None, mode='r', fileobj=None, format=DEFAULT_FORMAT, tarinfo=TarInfo, dereference=False, ignore_zeros=False, encoding=ENCODING, errors='surrogateescape', pax_headers=None, debug=0, errorlevel=1, stream=False) -
Все следующие аргументы являются необязательными и могут быть доступны также как атрибуты экземпляра.
name — путь к архиву. name может быть объектом пути. Он может быть опущен, если задан fileobj. В этом случае используется атрибут
nameобъекта файла, если он существует.mode — либо
'r'для чтения из существующего архива,'a'для добавления данных в существующий файл,'w'для создания нового файла, перезаписывая существующий, или'x'для создания нового файла только если он ещё не существует.Если задан fileobj, он используется для чтения или записи данных. Если это возможно, mode переопределяется режимом fileobj. fileobj будет использоваться с позиции 0.
Примечание
fileobj не закрывается, когда
TarFileзакрывается.format управляет форматом архива при записи. Он должен быть одним из констант
USTAR_FORMAT,GNU_FORMATилиPAX_FORMAT, определённых на уровне модуля. При чтении формат будет автоматически определён, даже если присутствуют различные форматы в одном архиве.Аргумент tarinfo может быть использован для замены стандартного класса
TarInfoна другой.Если dereference равен
False, добавить символические и жёсткие ссылки в архив. Если равенTrue, добавить содержимое целевых файлов в архив. Это не имеет эффекта на системах, которые не поддерживают символические ссылки.Если ignore_zeros равен
False, обрабатывать пустой блок как конец архива. Если равенTrue, пропускать пустые (и некорректные) блоки и пытаться получить как можно больше членов. Это полезно только при чтении склеенных или повреждённых архивов.debug может быть установлен от
0(без сообщений отладки) до3(все сообщения отладки). Сообщения записываются вsys.stderr.errorlevel управляет тем, как обрабатываются ошибки извлечения, см.
the corresponding attribute.Аргументы encoding и errors определяют кодировку символов, используемую для чтения или записи архива, и то, как обрабатываются ошибки преобразования. Значения по умолчанию подойдут большинству пользователей. См. раздел Вопросы Unicode для подробной информации.
Аргумент pax_headers — необязательный словарь строк, который будет добавлен в глобальный заголовок pax, если format равен
PAX_FORMAT.Если stream установлен в
True, то при чтении архива информация о файлах в архиве не кэшируется, экономя память.Изменено в версии 3.2: Использовать
'surrogateescape'в качестве значения по умолчанию для аргумента errors.Изменено в версии 3.5: Добавлен режим
'x'(исключительное создание).Изменено в версии 3.6: Параметр name принимает объект пути.
Изменено в версии 3.13: Добавлен параметр stream.
-
classmethod TarFile.open(...) -
Альтернативный конструктор. Функция
tarfile.open()фактически является сокращением для этого метода класса.
-
TarFile.getmember(name) -
Возвращает объект
TarInfoдля члена name. Если name не найден в архиве, возникаетKeyError.Примечание
Если член встречается более одного раза в архиве, предполагается, что последняя встреча является наиболее актуальной версией.
-
TarFile.getmembers() -
Возвращает члены архива в виде списка объектов
TarInfo. Список имеет тот же порядок, что и члены в архиве.
-
TarFile.getnames() -
Возвращает члены в виде списка их имён. Он имеет тот же порядок, что и список, возвращаемый
getmembers().
-
TarFile.list(verbose=True, *, members=None) -
Выводит таблицу содержимого в
sys.stdout. Если verbose равенFalse, выводятся только имена членов. Если равенTrue, вывод аналогичен выводу ls -l. Если задан необязательный members, он должен быть подмножеством списка, возвращаемогоgetmembers().Изменено в версии 3.5: Добавлен параметр members.
-
TarFile.extractall(path='.', members=None, *, numeric_owner=False, filter=None) -
Извлечь все члены из архива в текущую рабочую директорию или директорию path. Если указан необязательный параметр members, он должен быть подмножеством списка, возвращаемого
getmembers(). Информация о директориях, такие как владелец, время изменения и разрешения, устанавливаются после извлечения всех членов. Это делается для решения двух проблем: время изменения директории сбрасывается каждый раз, когда в ней создается файл. И, если разрешения директории не позволяют записи, извлечение файлов в неё завершится ошибкой.Если numeric_owner равен
True, используются значения uid и gid из архива tar для установки владельца/группы для извлечённых файлов. В противном случае используются именованные значения из архива tar.Аргумент filter определяет, как
membersизменяются или отклоняются перед извлечением. Подробности см. в разделе Фильтры извлечения. Рекомендуется явно задавать его в зависимости от тех функций tar, которые вам нужны.Предупреждение
Никогда не извлекайте архивы из ненадежных источников без предварительного осмотра. Возможно, файлы создаются вне path, например, члены, у которых имена файлов начинаются с
"/"или имена файлов содержат две точки"..".Установите
filter='data', чтобы предотвратить самые опасные проблемы безопасности, и прочитайте раздел Фильтры извлечения для получения подробностей.Изменено в версии 3.5: Добавлен параметр numeric_owner.
Изменено в версии 3.6: Параметр path принимает объект-путь.
Изменено в версии 3.12: Добавлен параметр filter.
-
TarFile.extract(member, path='', set_attrs=True, *, numeric_owner=False, filter=None) -
Извлечь член из архива в текущую рабочую директорию, используя его полное имя. Его информация о файле извлекается максимально точно. member может быть именем файла или объектом
TarInfo. Вы можете указать другую директорию, используя path. path может быть объектом-путь. Атрибуты файла (владелец, mtime, режим) устанавливаются, если set_attrs не равно false.Аргументы numeric_owner и filter такие же, как для
extractall().Примечание
Метод
extract()не учитывает несколько проблем с извлечением. В большинстве случаев следует использовать методextractall().Предупреждение
См. предупреждение для
extractall().Установите
filter='data', чтобы предотвратить самые опасные проблемы безопасности, и прочитайте раздел Фильтры извлечения для получения подробностей.Изменено в версии 3.2: Добавлен параметр set_attrs.
Изменено в версии 3.5: Добавлен параметр numeric_owner.
Изменено в версии 3.6: Параметр path принимает объект-путь.
Изменено в версии 3.12: Добавлен параметр filter.
-
TarFile.extractfile(member) -
Извлечь член из архива как объект файла. member может быть именем файла или объектом
TarInfo. Если member является обычным файлом или ссылкой, возвращается объектio.BufferedReader. Для всех других существующих членов возвращаетсяNone. Если member не найден в архиве, возникает исключениеKeyError.Изменено в версии 3.3: Возвращается объект
io.BufferedReader.Изменено в версии 3.13: Возвращаемый объект
io.BufferedReaderимеет атрибутmode, который всегда равен'rb'.
-
TarFile.errorlevel: int -
Если errorlevel равен
0, ошибки игнорируются при использованииTarFile.extract()иTarFile.extractall(). Тем не менее, они отображаются как сообщения об ошибках в отладочном выводе, когда debug больше 0. Если1(по умолчанию), все ошибки вызываются как исключенияOSErrorилиFilterError. Если2, все некритические ошибки вызываются как исключенияTarErrorтакже.Некоторые исключения, например, те, которые вызваны неправильными типами аргументов или повреждением данных, всегда вызываются.
Пользовательские фильтры извлечения должны вызывать
FilterErrorдля критических ошибок иExtractErrorдля некритических.Обратите внимание, что при возникновении исключения архив может быть частично извлечен. Пользователь отвечает за очистку.
-
TarFile.extraction_filter -
Добавлен в версии 3.12.
Фильтр извлечения, используемый по умолчанию для аргумента filter методов
extract()иextractall().Атрибут может быть
Noneили вызываемым объектом. Имена строк для этого атрибута запрещены, в отличие от аргумента filter методовextract().Если
extraction_filterравенNone(по умолчанию), вызов метода извлечения без аргумента filter вызовет исключениеDeprecationWarningи вернётся к фильтруfully_trusted, чье опасное поведение соответствует предыдущим версиям Python.В Python 3.14+ оставление
extraction_filter=Noneприведет к тому, что методы извлечения по умолчанию будут использовать фильтрdata.Атрибут может быть задан для экземпляров или переопределён в подклассах. Также возможно установить его для самого класса
TarFile, чтобы установить глобальный параметр по умолчанию, хотя, поскольку это влияет на все использования tarfile, лучшим практическим решением является установка только в основных приложениях илиsite configuration. Для установки глобального параметра по умолчанию таким образом, функция-фильтр должна быть обернута вstaticmethod(), чтобы предотвратить введение аргументаself.
-
TarFile.add(name, arcname=None, recursive=True, *, filter=None) -
Добавить файл name в архив. name может быть любого типа (каталог, FIFO, символическая ссылка и т. д.). Если указано, arcname задаёт альтернативное имя файла в архиве. Каталоги добавляются рекурсивно по умолчанию. Это можно избежать, задав recursive в значение
False. Рекурсия добавляет записи в отсортированном порядке. Если задан filter, он должен быть функцией, принимающей аргумент объектаTarInfoи возвращающей изменённый объектTarInfo. Если вместо этого возвращаетсяNone, объектTarInfoбудет исключён из архива. Пример см. в разделе Примеры.Изменено в версии 3.2: Добавлен параметр filter.
Изменено в версии 3.7: Рекурсия добавляет записи в отсортированном порядке.
-
TarFile.addfile(tarinfo, fileobj=None) -
Добавить объект
TarInfotarinfo в архив. Если tarinfo представляет собой обычный файл ненулевого размера, аргумент fileobj должен быть двоичным файлом, иtarinfo.sizeбайта будут считаны из него и добавлены в архив. Вы можете создавать объектыTarInfoнепосредственно или с помощьюgettarinfo().Изменено в версии 3.13: fileobj должен быть указан для файлов обычного типа ненулевого размера.
-
TarFile.gettarinfo(name=None, arcname=None, fileobj=None) -
Создать объект
TarInfoиз результатаos.stat()или эквивалента для существующего файла. Файл называется либо name, либо задаётся как объект файла fileobj с дескриптором файла. name может быть объектом пути. Если задано, arcname указывает альтернативное имя файла в архиве, иначе имя берется из атрибутаnameобъекта fileobj или аргумента name. Имя должно быть строкой.Вы можете изменить некоторые атрибуты объекта
TarInfoперед добавлением с помощьюaddfile(). Если объект файла не является обычным файлом, расположенным в начале файла, возможно потребуется изменение атрибутов, таких какsize. Это относится к объектам, таким какGzipFile. Атрибутnameтакже может быть изменён, в этом случае arcname может быть пустой строкой.Изменено в версии 3.6: Параметр name принимает объект пути.
-
TarFile.close() -
Закрыть
TarFile. В режиме записи в архив добавляются два завершающих нулевых блока.
-
TarFile.pax_headers: dict -
Словарь, содержащий пары ключ-значение глобальных заголовков pax.
Объекты TarInfo
Объект TarInfo представляет собой один элемент в TarFile. Помимо хранения всех необходимых атрибутов файла (например, типа файла, размера, времени, разрешений, владельца и т. д.), он предоставляет несколько полезных методов для определения его типа. Он не содержит самих данных файла.
Объекты TarInfo возвращаются методами getmember(), getmembers() и gettarinfo() TarFile.
Изменение объектов, возвращаемых методами getmember() или getmembers(), повлияет на все последующие операции с архивом. В случаях, когда это нежелательно, вы можете использовать copy.copy() или вызвать метод replace(), чтобы создать изменённую копию в одном шаге.
Несколько атрибутов могут быть установлены в None, чтобы указать, что часть метаданных не используется или неизвестна. Различные методы TarInfo обрабатывают None по-разному:
- Методы
extract()илиextractall()проигнорируют соответствующие метаданные, оставив их установленным по умолчанию. -
addfile()завершится с ошибкой. -
list()выведет строку-заполнитель.
-
class tarfile.TarInfo(name='') -
Создаёт объект
TarInfo.
-
classmethod TarInfo.frombuf(buf, encoding, errors) -
Создаёт и возвращает объект
TarInfoиз строкового буфера buf.Возбуждает исключение
HeaderError, если буфер некорректен.
-
classmethod TarInfo.fromtarfile(tarfile) -
Читает следующий элемент из объекта
TarFiletarfile и возвращает его как объектTarInfo.
-
TarInfo.tobuf(format=DEFAULT_FORMAT, encoding=ENCODING, errors='surrogateescape') -
Создаёт строковый буфер из объекта
TarInfo. Для получения информации об аргументах, обратитесь к конструктору классаTarFile.Изменено в версии 3.2: Используется
'surrogateescape'в качестве значения по умолчанию для аргумента errors.
Объект TarInfo имеет следующие публичные атрибуты данных:
-
TarInfo.name: str -
Имя элемента архива.
-
TarInfo.size: int -
Размер в байтах.
-
TarInfo.mtime: int | float -
Время последнего изменения в секундах с момента эпохи, как в
os.stat_result.st_mtime.Изменено в версии 3.12: Может быть установлено в
Noneдляextract()иextractall(), вызывая пропуск применения этого атрибута при извлечении.
-
TarInfo.mode: int -
Биты разрешений, как в
os.chmod().Изменено в версии 3.12: Может быть установлено в
Noneдляextract()иextractall(), вызывая пропуск применения этого атрибута при извлечении.
-
TarInfo.type -
Тип файла. type обычно является одним из этих констант:
REGTYPE,AREGTYPE,LNKTYPE,SYMTYPE,DIRTYPE,FIFOTYPE,CONTTYPE,CHRTYPE,BLKTYPE,GNUTYPE_SPARSE. Для более удобного определения типа объектаTarInfoиспользуйте следующие методыis*().
-
TarInfo.linkname: str -
Имя целевого файла, которое присутствует только в объектах
TarInfoтипаLNKTYPEиSYMTYPE.Для символических ссылок (
SYMTYPE), linkname является относительным к каталогу, содержащему ссылку. Для жёстких ссылок (LNKTYPE), linkname является относительным к корню архива.
-
TarInfo.uid: int -
Идентификатор пользователя пользователя, который первоначально сохранил этот элемент.
Изменено в версии 3.12: Может быть установлено в
Noneдляextract()иextractall(), вызывая пропуск применения этого атрибута при извлечении.
-
TarInfo.gid: int -
Идентификатор группы пользователя, который первоначально сохранил этот элемент.
Изменено в версии 3.12: Может быть установлено в
Noneдляextract()иextractall(), вызывая пропуск применения этого атрибута при извлечении.
-
TarInfo.uname: str -
Имя пользователя.
Изменено в версии 3.12: Может быть установлено в
Noneдляextract()иextractall(), вызывая пропуск применения этого атрибута при извлечении.
-
TarInfo.gname: str -
Имя группы.
Изменено в версии 3.12: Может быть установлено в
Noneдляextract()иextractall(), вызывая пропуск применения этого атрибута при извлечении.
-
TarInfo.chksum: int -
Контрольная сумма заголовка.
-
TarInfo.devmajor: int -
Главный номер устройства.
-
TarInfo.devminor: int -
Номер младшего устройства.
-
TarInfo.offset: int -
Здесь начинается заголовок tar.
-
TarInfo.offset_data: int -
Здесь начинается данные файла.
-
TarInfo.sparse -
Информация о разряженном члене.
-
TarInfo.pax_headers: dict -
Словарь, содержащий пары ключ-значение связанного расширенного заголовка pax.
-
TarInfo.replace(name=..., mtime=..., mode=..., linkname=..., uid=..., gid=..., uname=..., gname=..., deep=True) -
Добавлен в версии 3.12.
Возвращает новую копию объекта
TarInfoс изменёнными атрибутами. Например, чтобы вернутьTarInfoс именем группы, установленным на'staff', используйте:new_tarinfo = old_tarinfo.replace(gname='staff')
По умолчанию создаётся глубокая копия. Если deep ложно, копия является поверхностной, то есть
pax_headersи любые пользовательские атрибуты совместно используются с исходным объектомTarInfo.
Объект TarInfo также предоставляет некоторые удобные методы запроса:
-
TarInfo.isreg() -
То же самое, что и
isfile().
-
TarInfo.isdir() -
Возвращает
True, если это каталог.
-
TarInfo.issym() -
Возвращает
True, если это символическая ссылка.
-
TarInfo.islnk() -
Возвращает
True, если это жёсткая ссылка.
-
TarInfo.ischr() -
Возвращает
True, если это символьное устройство.
-
TarInfo.isblk() -
Возвращает
True, если это блочное устройство.
-
TarInfo.isfifo() -
Возвращает
True, если это FIFO.
-
TarInfo.isdev() -
Возвращает
True, если это символьное устройство, блочное устройство или FIFO.
Фильтры извлечения
Добавлен в версии 3.12.
Формат tar предназначен для захвата всех деталей файловой системы, подобной UNIX, что делает его очень мощным. К сожалению, эти возможности позволяют создавать файлы tar, которые при извлечении могут иметь непредвиденные — и возможно, злонамеренные — последствия. Например, извлечение файла tar может перезаписать произвольные файлы различными способами (например, с помощью абсолютных путей, .. компонентов пути или символьных ссылок, которые влияют на последующие члены).
В большинстве случаев полная функциональность не требуется. Поэтому tarfile поддерживает фильтры извлечения: механизм ограничения функциональности и, таким образом, смягчения некоторых проблем безопасности.
См. также
- PEP 706
-
Содержит дополнительную мотивацию и обоснование дизайна.
Аргумент filter для TarFile.extract() или extractall() может быть:
- строкой
'fully_trusted': Учитывать все метаданные, как указано в архиве. Следует использовать, если пользователь полностью доверяет архиву или реализует собственную сложную проверку. - строкой
'tar': Учитывать большинство функций, специфичных для tar (т.е. функций файловых систем, подобных UNIX), но блокировать функции, которые, скорее всего, будут неожиданными или злонамеренными. Подробности см. вtar_filter(). - строкой
'data': Игнорировать или блокировать большинство функций, специфичных для файловых систем, подобных UNIX. Предназначено для извлечения кроссплатформенных архивов данных. Подробности см. вdata_filter(). -
None(по умолчанию): ИспользоватьTarFile.extraction_filter.Если это также
None(по умолчанию), вызывается исключениеDeprecationWarning, и используется резервный'fully_trusted'фильтр, поведение которого соответствует предыдущим версиям Python.В Python 3.14 фильтр
'data'станет по умолчанию. Возможно переключение раньше; см.TarFile.extraction_filter. -
Функцию, которая будет вызываться для каждого извлекаемого члена с объектом TarInfo, описывающим член и путь назначения, куда извлекается архив (т.е. одинаковый путь используется для всех членов):
filter(member: TarInfo, path: str, /) -> TarInfo | None
Функция вызывается непосредственно перед извлечением каждого члена, поэтому она может учитывать текущее состояние диска. Она может:
- вернуть объект
TarInfo, который будет использован вместо метаданных из архива, или - вернуть
None, в этом случае член будет пропущен, или - вызвать исключение для прерывания операции или пропуска члена, в зависимости от
errorlevel. Обратите внимание, что при прерывании извлеченияextractall()может оставить архив частично извлеченным. Он не пытается выполнить очистку.
- вернуть объект
Фильтры по умолчанию с именами
Определенные предварительно фильтры с именами доступны как функции, поэтому они могут быть повторно использованы в пользовательских фильтрах:
-
tarfile.fully_trusted_filter(member, path) -
Возвращает член без изменений.
Реализует фильтр
'fully_trusted'.
-
tarfile.tar_filter(member, path) -
Реализует фильтр
'tar'.- Удаляет ведущие косые черты (
/иos.sep) из имен файлов. -
Отклоняет извлечение файлов с абсолютными путями (если имя является абсолютным даже после удаления косых черт, например,
C:/fooв Windows). Это вызываетAbsolutePathError. -
Отклоняет извлечение файлов, абсолютный путь которых (после следования символьных ссылкам) окажется за пределами назначения. Это вызывает
OutsideDestinationError. - Очищает биты высокого режима (setuid, setgid, sticky) и биты записи группы/других (
S_IWGRP|S_IWOTH).
Возвращает измененный
TarInfoчлен. - Удаляет ведущие косые черты (
-
tarfile.data_filter(member, path) -
Реализует фильтр
'data'. В дополнение к тому, что делаетtar_filter:-
Отклоняет извлечение ссылок (жестких или мягких), которые ссылаются на абсолютные пути или ссылки, выходящие за пределы назначения.
Это вызывает
AbsoluteLinkErrorилиLinkOutsideDestinationError.Обратите внимание, что такие файлы отклоняются даже на платформах, не поддерживающих символьные ссылки.
-
Отклоняет извлечение устройств (включая каналы). Это вызывает
SpecialFileError. -
Для обычных файлов, включая жёсткие ссылки:
- Для других файлов (каталогов) устанавливает
modeвNone, чтобы методы извлечения пропустили применение битов разрешений. - Устанавливает информацию о пользователе и группе (
uid,gid,uname,gname) вNone, чтобы методы извлечения пропустили их установку.
Возвращает измененный
TarInfoчлен. -
Ошибки фильтра
Когда фильтр отказывается извлечь файл, он вызывает соответствующее исключение, подкласс FilterError. Это прервёт извлечение, если TarFile.errorlevel равно 1 или больше. При значении errorlevel=0 ошибка будет записана в журнал, а член будет пропущен, но извлечение продолжится.
Рекомендации по дополнительной проверке
Даже с применением filter='data', tarfile не подходит для извлечения недоверенных файлов без предварительного анализа. Среди прочих проблем, предварительно определённые фильтры не предотвращают атаки типа "отказ в обслуживании". Пользователи должны проводить дополнительные проверки.
Вот неполный список моментов, которые следует учитывать:
- Извлекать в
new temporary directory, чтобы предотвратить, например, использование существующих ссылок и упростить очистку после неудачного извлечения. - При работе с недоверенными данными используйте внешние (например, на уровне ОС) ограничения на использование диска, памяти и ЦП.
- Проверяйте имена файлов на соответствие разрешённому набору символов (для фильтрации управляющих символов, неоднозначных символов, иностранных разделителей путей и т. д.).
- Проверяйте, что имена файлов имеют ожидаемые расширения (для предотвращения файлов, которые запускаются при «щелчке по ним», или файлов без расширений, таких как имена специальных устройств в Windows).
- Ограничивайте количество извлекаемых файлов, общий размер извлекаемых данных, длину имён файлов (включая длину символьных ссылок) и размер отдельных файлов.
- Проверяйте наличие файлов, которые будут скрыты в файловых системах с регистронезависимым режимом.
Также обратите внимание:
- Файлы tar могут содержать несколько версий одного и того же файла. Более поздние версии должны перезаписывать предыдущие. Эта функция имеет решающее значение для обновления ленточных архивов, но может быть злонамеренно использована.
- tarfile не защищает от проблем с «живыми» данными, например, от атаки злоумышленника, изменяющего целевой (или исходный) каталог во время извлечения (или архивирования).
Поддержка более старых версий Python
Фильтры извлечения были добавлены в Python 3.12, но могут быть перенесены в более старые версии в качестве обновлений безопасности. Чтобы проверить доступность функции, используйте, например, hasattr(tarfile, 'data_filter'), а не проверку версии Python.
Следующие примеры показывают, как поддерживать версии Python с и без функции. Обратите внимание, что установка extraction_filter повлияет на все последующие операции.
-
Архив с полным доверием:
my_tarfile.extraction_filter = (lambda member, path: member) my_tarfile.extractall()
-
Используйте фильтр
'data', если он доступен, но вернитесь к поведению Python 3.11 ('fully_trusted'), если эта функция недоступна:my_tarfile.extraction_filter = getattr(tarfile, 'data_filter', (lambda member, path: member)) my_tarfile.extractall() -
Используйте фильтр
'data'; откажитесь, если он недоступен:my_tarfile.extractall(filter=tarfile.data_filter)
или:
my_tarfile.extraction_filter = tarfile.data_filter my_tarfile.extractall()
-
Используйте фильтр
'data'; выведите предупреждение, если он недоступен:if hasattr(tarfile, 'data_filter'): my_tarfile.extractall(filter='data') else: # remove this when no longer needed warn_the_user('Extracting may be unsafe; consider updating Python') my_tarfile.extractall()
Пример фильтра извлечения с состоянием
Хотя методы извлечения tarfile принимают простую вызываемую функцию filter, пользовательские фильтры могут быть более сложными объектами с внутренним состоянием. Может быть полезно написать их как менеджеры контекста, чтобы использовать их так:
with StatefulFilter() as filter_func:
tar.extractall(path, filter=filter_func)
Такой фильтр можно написать, например, так:
class StatefulFilter:
def __init__(self):
self.file_count = 0
def __enter__(self):
return self
def __call__(self, member, path):
self.file_count += 1
return member
def __exit__(self, *exc_info):
print(f'{self.file_count} files extracted')
Командная строка
Добавлен в версии 3.4.
Модуль tarfile предоставляет простой интерфейс командной строки для взаимодействия с архивами tar.
Если вы хотите создать новый архив tar, укажите его имя после опции -c, а затем перечислите имя(а) файла(ов), которые должны быть включены:
$ python -m tarfile -c monty.tar spam.txt eggs.txt
Также допустимо передавать каталог:
$ python -m tarfile -c monty.tar life-of-brian_1979/
Если вы хотите извлечь архив tar в текущий каталог, используйте опцию -e:
$ python -m tarfile -e monty.tar
Также можно извлечь архив tar в другой каталог, передав имя каталога:
$ python -m tarfile -e monty.tar other-dir/
Для получения списка файлов в архиве tar используйте опцию -l:
$ python -m tarfile -l monty.tar
Параметры командной строки
-
-l <tarfile> -
--list <tarfile> -
Список файлов в файле tar.
-
-c <tarfile> <source1> ... <sourceN> -
--create <tarfile> <source1> ... <sourceN> -
Создание файла tar из исходных файлов.
-
-e <tarfile> [<output_dir>] -
--extract <tarfile> [<output_dir>] -
Извлечение файла tar в текущий каталог, если output_dir не указан.
-
-t <tarfile> -
--test <tarfile> -
Проверка того, является ли файл tar допустимым или нет.
-
-v, --verbose -
Подробный вывод.
-
--filter <filtername> -
Указывает filter для
--extract. Подробности см. в разделе Фильтры извлечения. Принимаются только строковые имена (то естьfully_trusted,tarиdata).
Примеры
Как извлечь весь архив tar в текущий рабочий каталог:
import tarfile
tar = tarfile.open("sample.tar.gz")
tar.extractall(filter='data')
tar.close()
Как извлечь подмножество архива tar с помощью TarFile.extractall(), используя функцию генератора вместо списка:
import os
import tarfile
def py_files(members):
for tarinfo in members:
if os.path.splitext(tarinfo.name)[1] == ".py":
yield tarinfo
tar = tarfile.open("sample.tar.gz")
tar.extractall(members=py_files(tar))
tar.close()
Как создать неархивированный архив tar из списка имен файлов:
import tarfile
tar = tarfile.open("sample.tar", "w")
for name in ["foo", "bar", "quux"]:
tar.add(name)
tar.close()
Тот же пример с использованием инструкции with:
import tarfile
with tarfile.open("sample.tar", "w") as tar:
for name in ["foo", "bar", "quux"]:
tar.add(name)
Как прочитать сжатый gzip архив tar и отобразить некоторые сведения о членах:
import tarfile
tar = tarfile.open("sample.tar.gz", "r:gz")
for tarinfo in tar:
print(tarinfo.name, "is", tarinfo.size, "bytes in size and is ", end="")
if tarinfo.isreg():
print("a regular file.")
elif tarinfo.isdir():
print("a directory.")
else:
print("something else.")
tar.close()
Как создать архив и сбросить информацию о пользователе, используя параметр filter в TarFile.add():
import tarfile
def reset(tarinfo):
tarinfo.uid = tarinfo.gid = 0
tarinfo.uname = tarinfo.gname = "root"
return tarinfo
tar = tarfile.open("sample.tar.gz", "w:gz")
tar.add("foo", filter=reset)
tar.close()
Поддерживаемые форматы tar
Существует три формата tar, которые можно создать с помощью модуля tarfile:
- Формат ustar POSIX.1-1988 (
USTAR_FORMAT). Он поддерживает имена файлов длиной не более 256 символов и имена ссылок до 100 символов. Максимальный размер файла составляет 8 ГБ. Это старый и ограниченный, но широко поддерживаемый формат. - Формат GNU tar (
GNU_FORMAT). Он поддерживает длинные имена файлов и ссылок, файлы размером более 8 ГБ и разреженные файлы. Это фактический стандарт в системах GNU/Linux.tarfileполностью поддерживает расширения GNU tar для длинных имен, поддержка разреженных файлов только для чтения. -
Формат pax POSIX.1-2001 (
PAX_FORMAT). Это наиболее гибкий формат практически без ограничений. Он поддерживает длинные имена файлов и ссылок, большие файлы и хранит имена путей портативным способом. Современные реализации tar, включая GNU tar, bsdtar/libarchive и star, полностью поддерживают расширенные функции pax; некоторые старые или не поддерживаемые библиотеки могут не поддерживать это, но должны обрабатывать архивы pax так, как если бы они были в универсально поддерживаемом формате ustar. Это текущий формат по умолчанию для новых архивов.Он расширяет существующий формат ustar дополнительными заголовками для информации, которая не может быть сохранена иначе. Существуют два варианта заголовков pax: расширенные заголовки влияют только на последующий заголовок файла, глобальные заголовки действительны для всего архива и влияют на все последующие файлы. Все данные в заголовке pax закодированы в UTF-8 для обеспечения портативности.
Есть еще несколько вариантов формата tar, которые можно читать, но не создавать:
- Древний формат V7. Это первый формат tar из Unix Seventh Edition, хранящий только обычные файлы и каталоги. Имена не должны быть длиннее 100 символов, нет информации об имени пользователя/группы. В некоторых архивах вычислены контрольные суммы заголовков в случае полей с символами, не являющимися ASCII.
- Расширенный формат tar SunOS. Этот формат является вариантом формата pax POSIX.1-2001, но несовместим.
Проблемы с Unicode
Формат tar изначально был задуман для создания резервных копий на ленточных накопителях, с основным фокусом на сохранении информации о файловой системе. В настоящее время архивы tar обычно используются для распространения файлов и обмена архивами по сетям. Одна проблема исходного формата (который является основой всех других форматов) заключается в отсутствии концепции поддержки различных кодировок символов. Например, обычный архив tar, созданный в системе UTF-8, не может быть корректно прочитан в системе Latin-1, если он содержит символы, не являющиеся ASCII. Текстовая метаданные (например, имена файлов, имена ссылок, имена пользователей/групп) будут повреждены. К сожалению, нет способа автоматически определить кодировку архива. Формат pax был разработан для решения этой проблемы. Он хранит метаданные, не являющиеся ASCII, с использованием универсальной кодировки символов UTF-8.
Подробности преобразования символов в tarfile контролируются ключевыми аргументами encoding и errors класса TarFile.
encoding определяет кодировку символов, которую следует использовать для метаданных в архиве. Значение по умолчанию — sys.getfilesystemencoding() или 'ascii' в качестве резервного варианта. В зависимости от того, читается или записывается архив, метаданные должны быть либо декодированы, либо закодированы. Если encoding не задан должным образом, это преобразование может не удаться.
Аргумент errors определяет, как обрабатываются символы, которые не могут быть преобразованы. Возможные значения указаны в разделе Обработчики ошибок. Схема по умолчанию — 'surrogateescape', которую Python также использует для системных вызовов файловой системы, см. Имена файлов, аргументы командной строки и переменные окружения.
Для архивов PAX_FORMAT (по умолчанию) encoding обычно не нужен, потому что все метаданные хранятся с использованием UTF-8. encoding используется только в редких случаях, когда декодируются двоичные заголовки pax или когда хранятся строки с суррогатными символами.
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/tarfile.html