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 может быть строкойstr, файлом или файлоподобным объектом.Изменено в версии 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) -
Все следующие аргументы являются необязательными и могут быть также доступны как атрибуты экземпляра.
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 определяет, как
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 может быть объектом, подобным пути. Атрибуты файла (владелец, время изменения, режим) устанавливаются, если 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.
-
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 в архив. Если задан 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: dict -
Словарь, содержащий пары ключ-значение глобальных заголовков pax.
Объекты TarInfo
Объект TarInfo представляет собой один член в TarFile. Помимо хранения всех необходимых атрибутов файла (например, тип файла, размер, время, разрешения, владелец и т.д.), он предоставляет некоторые полезные методы для определения его типа. Он не содержит сами данные файла.
Объекты TarInfo возвращаются методами TarFile getmember(), getmembers() и gettarinfo().
Изменение объектов, возвращаемых 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) -
Возвращает 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).
Примеры
Как извлечь весь архив 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
Модуль 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–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/tarfile.html