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'. Вот полный список комбинаций режимов:mode
действие
'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, сокетом или устройством ленты. Однако такой объект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(), если полученный буфер некорректен.
Следующие константы доступны на уровне модуля:
-
tarfile.ENCODING -
По умолчанию используется кодировка символов:
'utf-8'в Windows, в противном случае — значение, возвращаемоеsys.getfilesystemencoding().
Каждая из следующих констант определяет формат архива 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=0) -
Все следующие аргументы являются необязательными и могут быть также доступны как атрибуты экземпляра.
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 —
0, все ошибки игнорируются при использованииTarFile.extract(). Тем не менее, они отображаются как сообщения об ошибках в выводе отладки при включённой отладке. Если1, все критические ошибки генерируются как исключенияOSError. Если2, все некритические ошибки генерируются как исключенияTarError.Аргументы encoding и errors определяют кодировку символов, используемую для чтения или записи архива, и то, как обрабатываются ошибки преобразования. По умолчанию настройки подойдут большинству пользователей. Подробная информация содержится в разделе Проблемы с Unicode.
Аргумент pax_headers — необязательный словарь строк, который будет добавлен как глобальный заголовок pax, если format равен
PAX_FORMAT.Изменено в версии 3.2: По умолчанию для аргумента errors используется значение
'surrogateescape'.Изменено в версии 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) -
Извлекает все члены архива в текущий рабочий каталог или каталог path. Если задан необязательный параметр members, он должен быть подмножеством списка, возвращаемого
getmembers(). Информация о каталоге, такая как владелец, время изменения и права доступа, устанавливается после извлечения всех членов. Это сделано для решения двух проблем: время изменения каталога сбрасывается каждый раз при создании файла в нём. И если права доступа каталога не позволяют запись, извлечение файлов в него завершится ошибкой.Если numeric_owner —
True, для установки владельца/группы извлечённых файлов используются номера uid и gid из архива tar. В противном случае используются именованные значения из архива tar.Предупреждение
Никогда не извлекайте архивы из ненадежных источников без предварительной проверки. Возможны ситуации, когда файлы создаются вне path, например, члены с абсолютными именами, начинающимися с
"/"или именами с двумя точками"..".Изменено в версии 3.5: Добавлен параметр numeric_owner.
Изменено в версии 3.6: Параметр path принимает объект-путь.
-
TarFile.extract(member, path="", set_attrs=True, *, numeric_owner=False) -
Извлечь член из архива в текущий рабочий каталог, используя его полное имя. Информация о файле извлекается максимально точно. member может быть именем файла или объектом
TarInfo. Вы можете указать другой каталог, используя path. path может быть объектом пути. Атрибуты файла (владелец, время последнего изменения, режим) устанавливаются, если set_attrs не равно false.Если numeric_owner равен
True, используются номера uid и gid из tar-файла для установки владельца/группы извлеченных файлов. В противном случае используются именованные значения из tar-файла.Примечание
Метод
extract()не обрабатывает несколько проблем при извлечении. В большинстве случаев следует использовать методextractall().Предупреждение
См. предупреждение для
extractall().Изменено в версии 3.2: Добавлен параметр set_attrs.
Изменено в версии 3.5: Добавлен параметр numeric_owner.
Изменено в версии 3.6: Параметр path принимает объект пути.
-
TarFile.extractfile(member) -
Извлечь член из архива как объект файла. member может быть именем файла или объектом
TarInfo. Если member — обычный файл или ссылка, возвращается объектio.BufferedReader. Для всех других существующих членов возвращаетсяNone. Если member не найден в архиве, возникает исключениеKeyError.Изменено в версии 3.3: Возвращается объект
io.BufferedReader.
-
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().
-
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 -
Имя члена архива.
-
TarInfo.size -
Размер в байтах.
-
TarInfo.mtime -
Время последнего изменения.
-
TarInfo.mode -
Биты разрешений.
-
TarInfo.type -
Тип файла. type обычно является одним из этих констант:
REGTYPE,AREGTYPE,LNKTYPE,SYMTYPE,DIRTYPE,FIFOTYPE,CONTTYPE,CHRTYPE,BLKTYPE,GNUTYPE_SPARSE. Для удобного определения типа объектаTarInfoиспользуйте методыis*()ниже.
-
TarInfo.linkname -
Имя целевого файла, которое присутствует только в объектах
TarInfoтипаLNKTYPEиSYMTYPE.
-
TarInfo.uid -
Идентификатор пользователя пользователя, который изначально сохранил этот член.
-
TarInfo.gid -
Идентификатор группы пользователя, который изначально сохранил этот член.
-
TarInfo.uname -
Имя пользователя.
-
TarInfo.gname -
Имя группы.
-
TarInfo.pax_headers -
Словарь, содержащий пары ключ-значение связанного расширенного заголовка pax.
Объект TarInfo также предоставляет некоторые удобные методы запроса:
-
TarInfo.isfile() -
Возвращает
True, если объект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.4.
Модуль tarfile предоставляет простой интерфейс командной строки для взаимодействия с тар-архивами.
Если вы хотите создать новый тар-архив, укажите его имя после опции -c, а затем перечислите имя(на) файла(ов), которые должны быть включены:
$ python -m tarfile -c monty.tar spam.txt eggs.txt
Также допустимо передать каталог:
$ python -m tarfile -c monty.tar life-of-brian_1979/
Если вы хотите извлечь тар-архив в текущий каталог, используйте опцию -e:
$ python -m tarfile -e monty.tar
Вы также можете извлечь тар-архив в другой каталог, передав имя каталога:
$ python -m tarfile -e monty.tar other-dir/
Для просмотра списка файлов в тар-архиве используйте опцию -l:
$ python -m tarfile -l monty.tar
Параметры командной строки
-
-l <tarfile> -
--list <tarfile> -
Список файлов в tarfile.
-
-c <tarfile> <source1> ... <sourceN> -
--create <tarfile> <source1> ... <sourceN> -
Создать tarfile из исходных файлов.
-
-e <tarfile> [<output_dir>] -
--extract <tarfile> [<output_dir>] -
Извлечь tarfile в текущий каталог, если output_dir не указан.
-
-t <tarfile> -
--test <tarfile> -
Проверить, является ли tarfile валидным.
-
-v, --verbose -
Подробный вывод.
Примеры
Как извлечь весь тар-архив в текущую рабочую директорию:
import tarfile
tar = tarfile.open("sample.tar.gz")
tar.extractall()
tar.close()
Как извлечь подмножество тар-архива с помощью 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()
Как создать неархивированный тар-архив из списка имён файлов:
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-сжатый тар-архив и отобразить информацию о некоторых членах:
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–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.9/library/tarfile.html