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).
Работает с каталогами, обычными файлами, жесткими ссылками, символическими ссылками, fifos, символьными устройствами и блочными устройствами и может получать и восстанавливать информацию о файлах, такую как метка времени, разрешения доступа и владелец.
Изменено в версии 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:'
Создать tarfile исключительно без сжатия. Вызвать исключение
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, он используется как альтернатива file object, открытому в двоичном режиме для 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()
(в зависимости от режима). bufsize задает размер блока и по умолчанию равен20 * 512
байт. Используйте этот вариант в сочетании, например, сsys.stdin
, сокетом file object или ленточным устройством. Однако такой объект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 принимает значение path-like object.
-
class
tarfile.
TarFile
Класс для чтения и записи архивов tar. Не используйте этот класс напрямую: вместо него используйте
tarfile.open()
. См. Объекты TarFile.
-
tarfile.
is_tarfile
(name)¶ Возвращает
True
, если name является файлом архива tar, который модульtarfile
может прочитать. name может бытьstr
, файлом или файлоподобным объектом.Изменено в версии 3.9: Поддержка файлов и файлоподобных объектов.
Модуль 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
.
См.также
- Модуль
zipfile
Документация стандартного модуля
zipfile
.- Операции архивирования
Документация по средствам архивирования более высокого уровня, предоставляемым стандартным модулем
shutil
.- GNU tar manual, Basic Tar Format
Документация для архивных файлов 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 может быть path-like object. Оно может быть опущено, если указан 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 определяют кодировку символов, которая будет использоваться для чтения или записи архива, и способ обработки ошибок преобразования. Настройки по умолчанию подойдут для большинства пользователей. Более подробную информацию смотрите в разделе Проблемы с юникодом.
Аргумент pax_headers представляет собой необязательный словарь строк, которые будут добавлены в качестве глобального заголовка pax, если формат равен
PAX_FORMAT
.Изменено в версии 3.2: Используйте
'surrogateescape'
по умолчанию для аргумента errors.Изменено в версии 3.5: Добавлен режим
'x'
(эксклюзивное создание).Изменено в версии 3.6: Параметр name принимает значение path-like object.
-
classmethod
TarFile.
open
(...)¶ Альтернативный конструктор. Функция
tarfile.open()
фактически является сокращением этого метода класса.
-
TarFile.
getmember
(name)¶ Возвращает объект
TarInfo
для члена 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 из tarfile. В противном случае используются именованные значения из tarfile.Предупреждение
Никогда не извлекайте архивы из ненадежных источников без предварительной проверки. Возможно, что файлы создаются вне path, например, члены, имеющие абсолютные имена, начинающиеся с
"/"
или имена с двумя точками".."
.Изменено в версии 3.5: Добавлен параметр numeric_owner.
Изменено в версии 3.6: Параметр path принимает значение path-like object.
-
TarFile.
extract
(member, path='', set_attrs=True, *, numeric_owner=False)¶ Извлечение члена из архива в текущий рабочий каталог, используя его полное имя. Информация о файле извлекается как можно точнее. член может быть именем файла или объектом
TarInfo
. Вы можете указать другой каталог, используя path. path может быть объектом path-like object. Атрибуты файла (owner, mtime, mode) устанавливаются, если set_attrs не равно false.Если numeric_owner равно
True
, то для задания владельца/группы извлеченных файлов используются номера uid и gid из tarfile. В противном случае используются именованные значения из tarfile.Примечание
Метод
extract()
не позволяет решить несколько проблем с извлечением. В большинстве случаев следует использовать методextractall()
.Предупреждение
См. предупреждение для
extractall()
.Изменено в версии 3.2: Добавлен параметр set_attrs.
Изменено в версии 3.5: Добавлен параметр numeric_owner.
Изменено в версии 3.6: Параметр path принимает значение path-like object.
-
TarFile.
extractfile
(member)¶ Извлечение члена из архива в виде объекта файла. член может быть именем файла или объектом
TarInfo
. Если член является обычным файлом или ссылкой, возвращается объектio.BufferedReader
. Для всех остальных существующих членов возвращаетсяNone
. Если член не встречается в архиве, выдается сообщение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: Добавлен параметр фильтр.
Изменено в версии 3.7: Рекурсия добавляет записи в отсортированном порядке.
-
TarFile.
addfile
(tarinfo, fileobj=None)¶ Добавить
TarInfo
объект tarinfo в архив. Если указан fileobj, то он должен быть binary file, из него считываютсяtarinfo.size
байтов и добавляются в архив. Вы можете создавать объектыTarInfo
непосредственно, или с помощьюgettarinfo()
.
-
TarFile.
gettarinfo
(name=None, arcname=None, fileobj=None)¶ Создать объект
TarInfo
из результата выполнения командыos.stat()
или эквивалентной ей команды над существующим файлом. Файл либо именуется name, либо указывается как file object fileobj с дескриптором файла. name может быть path-like object. Если задано, arcname определяет альтернативное имя файла в архиве, в противном случае имя берется из атрибутаname
fileobj или аргумента name. Имя должно быть текстовой строкой.Вы можете изменить некоторые атрибуты
TarInfo
перед тем, как добавить его с помощьюaddfile()
. Если объект файла не является обычным файловым объектом, расположенным в начале файла, атрибуты, такие какsize
, могут потребовать изменения. Это относится к таким объектам, какGzipFile
. Атрибутname
также может быть модифицирован, и в этом случае arcname может быть фиктивной строкой.Изменено в версии 3.6: Параметр name принимает значение path-like object.
-
TarFile.
close
()¶ Закройте
TarFile
. В режиме записи к архиву добавляются два завершающих нулевых блока.
-
TarFile.
pax_headers
¶ Словарь, содержащий пары ключ-значение глобальных заголовков pax.
Объекты TarInfo¶
Объект TarInfo
представляет один член в TarFile
. Помимо хранения всех необходимых атрибутов файла (таких как тип файла, размер, время, разрешения, владелец и т.д.), он предоставляет несколько полезных методов для определения его типа. Он не содержит сами данные файла.
Объекты TarInfo
возвращаются методами TarFile
getmember()
, getmembers()
и gettarinfo()
.
-
classmethod
TarInfo.
frombuf
(buf, encoding, errors)¶ Создать и вернуть объект
TarInfo
из строкового буфера buf.Вызывает
HeaderError
, если буфер недействителен.
-
classmethod
TarInfo.
fromtarfile
(tarfile)¶ Прочитайте следующий член из
TarFile
объекта tarfile и верните его как объект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
также предоставляет несколько удобных методов запроса:
Интерфейс командной строки¶
Добавлено в версии 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
Параметры командной строки¶
-
-c
<tarfile> <source1> ... <sourceN>
¶ -
--create
<tarfile> <source1> ... <sourceN>
¶ Создание tarfile из исходных файлов.
-
-e
<tarfile> [<output_dir>]
¶ -
--extract
<tarfile> [<output_dir>]
¶ Распаковать tarfile в текущий каталог, если output_dir не указан.
-
-v
,
--verbose
¶
Подробный вывод.
Примеры¶
Как извлечь весь архив 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¶
Существует три формата tar, которые могут быть созданы с помощью модуля tarfile
:
Формат POSIX.1-1988 ustar (
USTAR_FORMAT
). Он поддерживает имена файлов длиной в лучшем случае 256 символов и имена ссылок длиной до 100 символов. Максимальный размер файла составляет 8 Гигабайт. Это старый и ограниченный, но широко поддерживаемый формат.Формат GNU tar (
GNU_FORMAT
). Он поддерживает длинные имена файлов и имена ссылок, файлы размером более 8 Гб и разреженные файлы. Это стандарт де-факто в системах GNU/Linux.tarfile
полностью поддерживает расширения GNU tar для длинных имен, поддержка разреженных файлов доступна только для чтения.Формат POSIX.1-2001 pax (
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. Этот формат является вариантом формата POSIX.1-2001 pax, но не является совместимым.
Проблемы с юникодом¶
Изначально формат 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 или когда хранятся строки с суррогатными символами.