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.
-
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','r:gz','w:bz2','r:bz2','x:gz','x: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 принимает объект, подобный пути.
- 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 -
Ссылка (внутри tarfile)
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) -
Все следующие аргументы являются необязательными и также доступны как атрибуты экземпляра.
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.Изменено в версии 3.2: Используется
'surrogateescape'в качестве значения по умолчанию для аргумента errors.Изменено в версии 3.5: Добавлен режим
'x'(исключительного создания).Изменено в версии 3.6: Параметр name принимает объект, подобный пути.
-
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.next() -
Возвращает следующего члена архива в виде объекта
TarInfo, когдаTarFileоткрыт для чтения. ВозвращаетNone, если больше нет доступных членов.
-
TarFile.extractall(path='.', members=None, *, numeric_owner=False, filter=None) -
Извлекает все члены архива в текущую рабочую директорию или директорию path. Если необязательный параметр members задан, он должен быть подмножеством списка, возвращаемого методом
getmembers(). Информация о директориях, такой как владелец, время последнего изменения и разрешения, устанавливаются после извлечения всех членов. Это делается для решения двух проблем: время последнего изменения директории сбрасывается каждый раз при создании файла в ней. И, если разрешения директории не позволяют запись, извлечение файлов в неё завершится неудачно.Если numeric_owner равно
True, номера uid и gid из tar-файла используются для установки владельца/группы извлечённых файлов. В противном случае используются именованные значения из tar-файла.Аргумент filter, добавленный в Python 3.11.4, указывает, как
membersизменяются или отбрасываются перед извлечением. См. Фильтры извлечения для подробностей. Рекомендуется явно установить это значение в зависимости от того, какие возможности tar вам необходимо поддерживать.Предупреждение
Никогда не извлекайте архивы из ненадежных источников без предварительного их осмотра. Возможна ситуация, когда файлы создаются вне path, например, члены с абсолютными именами, начинающимися с
"/", или именами файлов с двумя точками"..".Установите
filter='data'для предотвращения наиболее опасных проблем безопасности и прочитайте раздел Фильтры извлечения для подробностей.Изменено в версии 3.5: Добавлен параметр numeric_owner.
Изменено в версии 3.6: Параметр path принимает объект, подобный пути.
Изменено в версии 3.11.4: Добавлен параметр filter.
-
TarFile.extract(member, path='', set_attrs=True, *, numeric_owner=False, filter=None) -
Извлечь член из архива в текущую рабочую директорию, используя его полное имя. Информация о файле извлекается максимально точно. member может быть именем файла или объектом
TarInfo. Вы можете указать другую директорию, используя path. path может быть объектом, подобным пути. Атрибуты файла (владелец, время последнего изменения, права доступа) устанавливаются, если set_attrs не равно false.Аргументы numeric_owner и filter такие же, как для
extractall().Примечание
Метод
extract()не обрабатывает несколько проблем при извлечении. В большинстве случаев вы должны использовать методextractall().Предупреждение
См. предупреждение для
extractall().Установите
filter='data'для предотвращения самых опасных проблем безопасности и ознакомьтесь с разделом Фильтры извлечения для получения подробной информации.Изменено в версии 3.2: Добавлен параметр set_attrs.
Изменено в версии 3.5: Добавлен параметр numeric_owner.
Изменено в версии 3.6: Параметр path принимает объект, подобный пути.
Изменено в версии 3.11.4: Добавлен параметр filter.
-
TarFile.extractfile(member) -
Извлечь член из архива как объект файла. member может быть именем файла или объектом
TarInfo. Если member представляет собой обычный файл или ссылку, возвращается объектio.BufferedReader. Для всех других существующих членов возвращаетсяNone. Если member не найден в архиве, генерируется исключениеKeyError.Изменено в версии 3.3: Возвращается объект
io.BufferedReader.
-
TarFile.errorlevel: int -
Если errorlevel равно
0, ошибки игнорируются при использованииTarFile.extract()иTarFile.extractall(). Тем не менее, они отображаются в качестве сообщений об ошибках в отладке, если debug больше 0. Если1(по умолчанию), все fatal ошибки генерируются как исключенияOSErrorилиFilterError. Если2, все некритические ошибки генерируются как исключенияTarErrorтоже.Некоторые исключения, например, вызванные неправильными типами аргументов или повреждением данных, всегда генерируются.
Пользовательские фильтры извлечения должны генерировать исключения
FilterErrorдля fatal ошибок иExtractErrorдля некритических.Обратите внимание, что при возникновении исключения архив может быть частично извлечен. Пользователь несет ответственность за очистку.
-
TarFile.extraction_filter -
Добавлен в версии 3.11.4.
Используемый по умолчанию фильтр извлечения для параметра filter методов
extract()иextractall().Атрибут может быть
Noneили вызываемым объектом. Имена строк для этого атрибута запрещены, в отличие от параметра filter для методаextract().Если
extraction_filterравноNone(по умолчанию), вызов метода извлечения без параметра filter будет использовать фильтрfully_trustedдля совместимости с предыдущими версиями Python.В Python 3.12+ оставление
extraction_filter=NoneвыведетDeprecationWarning.В 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 в архив. Если fileobj задан, он должен быть бинарным файлом, иtarinfo.sizeбайтов читаются из него и добавляются в архив. Вы можете создавать объектыTarInfoнапрямую или с помощьюgettarinfo().
-
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 -
Словарь, содержащий пары ключ-значение глобальных заголовков pax.
Объекты TarInfo
Объект TarInfo представляет собой один член в TarFile. Помимо хранения всех необходимых атрибутов файла (таких как тип файла, размер, время, разрешения, владелец и т. д.), он предоставляет некоторые полезные методы для определения его типа. Он не содержит сами данные файла.
Объекты TarInfo возвращаются методами TarFile getmember(), getmembers() и gettarinfo().
Изменение объектов, возвращаемых getmember() или getmembers(), повлияет на все последующие операции с архивом. В тех случаях, когда этого нежелательно, вы можете использовать copy.copy() или вызвать метод replace() для создания изменённой копии в одном шаге.
Несколько атрибутов могут быть установлены в None для обозначения того, что часть метаданных не используется или неизвестна. Разные методы TarInfo обрабатывают None по-разному:
- Методы
extract()илиextractall()проигнорируют соответствующие метаданные, оставив их установленным по умолчанию. addfile()завершится неудачей.list()выведет строку-заполнитель.
Изменено в версии 3.11.4: Добавлены replace() и обработка None.
-
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.11.4: Может быть установлено в
Noneдляextract()иextractall(), что заставит извлечение пропустить применение этого атрибута.
-
TarInfo.mode: int -
Биты разрешений, как и для
os.chmod().Изменено в версии 3.11.4: Может быть установлено в
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.11.4: Может быть установлено в
Noneдляextract()иextractall(), что заставит извлечение пропустить применение этого атрибута.
-
TarInfo.gid: int -
Идентификатор группы пользователя, который изначально сохранил этот член.
Изменено в версии 3.11.4: Может быть установлено в
Noneдляextract()иextractall(), что заставит извлечение пропустить применение этого атрибута.
-
TarInfo.uname: str -
Имя пользователя.
Изменено в версии 3.11.4: Может быть установлено в
Noneдляextract()иextractall(), что заставит извлечение пропустить применение этого атрибута.
-
TarInfo.gname: str -
Имя группы.
Изменено в версии 3.11.4: Может быть установлено в
Noneдляextract()иextractall(), что заставит извлечение пропустить применение этого атрибута.
-
TarInfo.pax_headers: dict -
Словарь, содержащий пары ключ-значение связанного расширенного заголовка pax.
-
TarInfo.replace(name=..., mtime=..., mode=..., linkname=..., uid=..., gid=..., uname=..., gname=..., deep=True) -
Новое в версии 3.11.4.
Возвращает новую копию объекта
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.11.4.
Формат 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(по умолчанию), будет использован фильтр'fully_trusted'(для совместимости со старыми версиями Python).В Python 3.12 значение по умолчанию будет выводить
DeprecationWarning.В 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) -
Возвращает member без изменений.
Реализует фильтр
'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> -
Указывает фильтр для
--extract. Подробности см. в разделе Фильтры извлечения. Принимаются только строковые имена (то естьfully_trusted,tar, иdata).Новое в версии 3.11.4.
Примеры
Как извлечь весь архив tar в текущую рабочую директорию:
import tarfile
tar = tarfile.open("sample.tar.gz")
tar.extractall()
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
Модуль tarfile может создавать три формата tar:
- Формат 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–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/library/tarfile.html