tarfile.md
1> **Источник:** https://python-all.ru/3.0/library/tarfile.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `tarfile` – Чтение и запись tar-архивов89Модуль `tarfile` позволяет читать и записывать tar-архивы, в том числе сжатые с помощью gzip или bz2. (Файлы `.zip` можно читать и записывать с помощью модуля [`zipfile`](https://python-all.ru/3.0/library/zipfile.html#module-zipfile).)1011Некоторые факты и цифры:1213- читает и записывает архивы, сжатые с помощью [`gzip`](https://python-all.ru/3.0/library/gzip.html#module-gzip) и [`bz2`](https://python-all.ru/3.0/library/bz2.html#module-bz2).14- поддержка чтения/записи формата POSIX.1-1988 (ustar).15- поддержка чтения/записи для формата GNU tar, включая расширения *longname* и *longlink*, поддержка только чтения для расширения *sparse*.16- поддержка чтения/записи формата POSIX.1-2001 (pax).17- работает с директориями, обычными файлами, жёсткими ссылками, символическими ссылками, каналами FIFO, символьными и блочными устройствами, а также может получать и восстанавливать информацию о файлах, такую как временная метка, права доступа и владелец.1819#### `[tarfile.open]tarfile.open(name=None, mode='r', fileobj=None, bufsize=10240, **kwargs)`2021Возвращает объект [`TarFile`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarFile) для пути *name*. Подробную информацию об объектах [`TarFile`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarFile) и разрешённых именованных аргументах см. в [*TarFile Objects*](https://python-all.ru/3.0/library/tarfile.html#tarfile-objects).2223*mode* должен быть строкой вида `'filemode[:compression]'`; по умолчанию используется `'r'`. Вот полный список комбинаций режимов:2425| Режим | Действие |26| --- | --- |27| `'r' или 'r:*'` | Открыть для чтения с прозрачным сжатием (рекомендуется). |28| `'r:'` | Открыть для чтения исключительно без сжатия. |29| `'r:gz'` | Открыть для чтения со сжатием gzip. |30| `'r:bz2'` | Открыть для чтения со сжатием bzip2. |31| `'a' или 'a:'` | Открыть для добавления без сжатия. Файл создаётся, если он не существует. |32| `'w' или 'w:'` | Открывается для записи без сжатия. |33| `'w:gz'` | Открывается для записи со сжатием gzip. |34| `'w:bz2'` | Открывается для записи со сжатием bzip2. |3536Обратите внимание, что `'a:gz'` или `'a:bz2'` невозможны. Если *mode* не подходит для чтения определённого (сжатого) файла, возбуждается [`ReadError`](https://python-all.ru/3.0/library/tarfile.html#tarfile.ReadError). Используйте *mode* `'r'`, чтобы избежать этого. Если метод сжатия не поддерживается, возбуждается [`CompressionError`](https://python-all.ru/3.0/library/tarfile.html#tarfile.CompressionError).3738Если указан *fileobj*, он используется вместо файлового объекта, открытого для *name*. Предполагается, что он находится в позиции 0.3940В особых случаях существует второй формат для *mode*: `'filemode|[compression]'`. [`tarfile.open()`](https://python-all.ru/3.0/library/tarfile.html#tarfile.open) вернет объект [`TarFile`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarFile), обрабатывающий данные как поток блоков. Произвольный доступ к файлу выполняться не будет. Если задан, *fileobj* может быть любым объектом, имеющим метод `read()` или `write()` (в зависимости от *mode*). *bufsize* задает размер блока; по умолчанию `20 * 512` байт. Используйте этот вариант в сочетании, например, с `sys.stdin`, файловым объектом сокета или ленточным устройством. Однако такой объект [`TarFile`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarFile) ограничен тем, что не допускает произвольного доступа; см. [*Примеры*](https://python-all.ru/3.0/library/tarfile.html#tar-examples). В настоящее время возможны следующие режимы:4142| Режим | Действие |43| --- | --- |44| `'r\|*'` | Открывает *поток данных* tar-блоков для чтения с прозрачным сжатием. |45| `'r\|'` | Открывает *поток данных* несжатых tar-блоков для чтения. |46| `'r\|gz'` | Открывает сжатый gzip *поток данных* для чтения. |47| `'r\|bz2'` | Открывает сжатый bzip2 *поток данных* для чтения. |48| `'w\|'` | Открывает несжатый *поток данных* для записи. |49| `'w\|gz'` | Открывает сжатый gzip *поток* для записи. |50| `'w\|bz2'` | Открывает сжатый bzip2 *поток* для записи. |5152#### `[tarfile.TarFile]class tarfile.TarFile`5354Класс для чтения и записи tar-архивов. Не используйте этот класс напрямую, вместо этого используйте5556[`tarfile.open()`](https://python-all.ru/3.0/library/tarfile.html#tarfile.open)5758. См.5960[*TarFile Objects*](https://python-all.ru/3.0/library/tarfile.html#tarfile-objects)6162.6364#### `[tarfile.is_tarfile]tarfile.is_tarfile(name)`6566Возвращает6768[`True`](https://python-all.ru/3.0/library/constants.html#True)6970, если7172*name*7374является tar-архивом, который может прочитать модуль7576`tarfile`7778.7980Модуль `tarfile` определяет следующие исключения:8182#### `[tarfile.TarError]exception tarfile.TarError`8384Базовый класс для всех исключений8586`tarfile`8788.8990#### `[tarfile.ReadError]exception tarfile.ReadError`9192Возбуждается, когда открывается tar-архив, который не может быть обработан модулем9394`tarfile`9596или каким-либо образом недействителен.9798#### `[tarfile.CompressionError]exception tarfile.CompressionError`99100Возникает, когда метод сжатия не поддерживается или данные не удаётся корректно декодировать.101102#### `[tarfile.StreamError]exception tarfile.StreamError`103104Возникает для ограничений, типичных для потокоподобных105106[`TarFile`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarFile)107108объектов.109110#### `[tarfile.ExtractError]exception tarfile.ExtractError`111112Возникает при113114*нефатальных*115116ошибках при использовании117118[`TarFile.extract()`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarFile.extract)119120, но только если121122`TarFile.errorlevel`123124`== 2`125126.127128#### `[tarfile.HeaderError]exception tarfile.HeaderError`129130Возникает при вызове131132[`TarInfo.frombuf()`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarInfo.frombuf)133134, если полученный буфер некорректен.135136Каждая из следующих констант определяет формат tar-архива, который может создать модуль `tarfile`. Подробнее см. раздел [*Поддерживаемые форматы tar*](https://python-all.ru/3.0/library/tarfile.html#tar-formats).137138#### `[tarfile.USTAR_FORMAT]tarfile.USTAR_FORMAT`139140Формат POSIX.1-1988 (ustar).141142#### `[tarfile.GNU_FORMAT]tarfile.GNU_FORMAT`143144Формат GNU tar.145146#### `[tarfile.PAX_FORMAT]tarfile.PAX_FORMAT`147148Формат POSIX.1-2001 (pax).149150#### `[tarfile.DEFAULT_FORMAT]tarfile.DEFAULT_FORMAT`151152Формат по умолчанию для создания архивов. В настоящее время это153154[`GNU_FORMAT`](https://python-all.ru/3.0/library/tarfile.html#tarfile.GNU_FORMAT)155156.157158На уровне модуля доступны следующие переменные:159160#### `[tarfile.ENCODING]tarfile.ENCODING`161162Кодировка по умолчанию, то есть значение из163164[`sys.getfilesystemencoding()`](https://python-all.ru/3.0/library/sys.html#sys.getfilesystemencoding)165166или167168[`sys.getdefaultencoding()`](https://python-all.ru/3.0/library/sys.html#sys.getdefaultencoding)169170.171172> **См. также**173>174> **Модуль [`zipfile`](https://python-all.ru/3.0/library/zipfile.html#module-zipfile)**175>176> Документация стандартного модуля177>178> [`zipfile`](https://python-all.ru/3.0/library/zipfile.html#module-zipfile)179>180> .181>182> **[Руководство GNU tar, базовый формат tar](https://python-all.ru/3.0/library/tarfile.html)**183>184> Документация для файлов архивов tar, включая расширения GNU tar.185186## Объекты TarFile187188Объект [`TarFile`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarFile) предоставляет интерфейс к tar-архиву. Tar-архив представляет собой последовательность блоков. Элемент архива (хранящийся файл) состоит из заголовочного блока, за которым следуют блоки данных. Можно хранить файл в tar-архиве несколько раз. Каждый элемент архива представлен объектом [`TarInfo`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarInfo), см. [*TarInfo Objects*](https://python-all.ru/3.0/library/tarfile.html#tarinfo-objects) для подробностей.189190#### `class tarfile.TarFile(name=None, mode='r', fileobj=None, format=DEFAULT_FORMAT, tarinfo=TarInfo, dereference=False, ignore_zeros=False, encoding=ENCODING, errors=None, pax_headers=None, debug=0, errorlevel=0)`191192Все последующие аргументы необязательны и также могут быть доступны как атрибуты экземпляра.193194*name* – это путь к архиву. Его можно опустить, если указан *fileobj*. В этом случае используется атрибут `name` файлового объекта, если он существует.195196*mode* может быть `'r'` для чтения существующего архива, `'a'` для добавления данных в существующий файл или `'w'` для создания нового файла с перезаписью существующего .197198Если указан *fileobj*, он используется для чтения или записи данных. Если это можно определить, *mode* переопределяется режимом *fileobj*. *fileobj* будет использоваться с позиции 0.199200> **Примечание**201>202> *fileobj* не закрывается, когда [`TarFile`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarFile) закрывается.203204*format* управляет форматом архива. Он должен быть одной из констант [`USTAR_FORMAT`](https://python-all.ru/3.0/library/tarfile.html#tarfile.USTAR_FORMAT), [`GNU_FORMAT`](https://python-all.ru/3.0/library/tarfile.html#tarfile.GNU_FORMAT) или [`PAX_FORMAT`](https://python-all.ru/3.0/library/tarfile.html#tarfile.PAX_FORMAT), которые определены на уровне модуля.205206Аргумент *tarinfo* можно использовать для замены класса по умолчанию [`TarInfo`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarInfo) на другой.207208Если *dereference* равен [`False`](https://python-all.ru/3.0/library/constants.html#False), символические и жёсткие ссылки добавляются в архив. Если он равен [`True`](https://python-all.ru/3.0/library/constants.html#True), в архив добавляется содержимое целевых файлов. Это не влияет на системы, не поддерживающие символические ссылки.209210Если *ignore\_zeros* равен [`False`](https://python-all.ru/3.0/library/constants.html#False), пустой блок считается концом архива. Если он равен [`True`](https://python-all.ru/3.0/library/constants.html#True), пустые (и недопустимые) блоки пропускаются, и предпринимается попытка получить как можно больше элементов. Это полезно только для чтения объединённых или повреждённых архивов.211212*debug* может быть установлен от `0` (нет отладочных сообщений) до `3` (все отладочные сообщения). Сообщения записываются в `sys.stderr`.213214Если *errorlevel* равен `0`, все ошибки игнорируются при использовании [`TarFile.extract()`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarFile.extract). Тем не менее, они отображаются как сообщения об ошибках в отладочном выводе, если отладка включена. Если `1`, все *фатальные* ошибки возбуждаются как исключения [`OSError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.OSError) или [`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError). Если `2`, все *нефатальные* ошибки также возбуждаются как исключения [`TarError`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarError).215216Аргументы *encoding* и *errors* определяют кодировку символов, используемую для чтения или записи архива, и способ обработки ошибок преобразования. Настройки по умолчанию подходят для большинства пользователей. Подробную информацию см. в разделе [*Проблемы Unicode*](https://python-all.ru/3.0/library/tarfile.html#tar-unicode).217218Аргумент *pax\_headers* – это необязательный словарь строк, который будет добавлен в качестве глобального заголовка pax, если *format* равен [`PAX_FORMAT`](https://python-all.ru/3.0/library/tarfile.html#tarfile.PAX_FORMAT).219220#### `[tarfile.TarFile.open]TarFile.open(...)`221222Альтернативный конструктор. Функция223224[`tarfile.open()`](https://python-all.ru/3.0/library/tarfile.html#tarfile.open)225226на самом деле является сокращением для этого метода класса.227228#### `[tarfile.TarFile.getmember]TarFile.getmember(name)`229230Возвращает объект [`TarInfo`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarInfo) для элемента *name*. Если *name* не найден в архиве, вызывается исключение [`KeyError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.KeyError).231232> **Примечание**233>234> Если элемент встречается в архиве более одного раза, последнее его вхождение считается самой актуальной версией.235236#### `[tarfile.TarFile.getmembers]TarFile.getmembers()`237238Возвращает элементы архива в виде списка объектов239240[`TarInfo`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarInfo)241242. Список имеет тот же порядок, что и элементы в архиве.243244#### `[tarfile.TarFile.getnames]TarFile.getnames()`245246Возвращает элементы в виде списка их имён. Он имеет тот же порядок, что и список, возвращаемый247248[`getmembers()`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarFile.getmembers)249250.251252#### `[tarfile.TarFile.list]TarFile.list(verbose=True)`253254Выводит оглавление в255256`sys.stdout`257258. Если259260*verbose*261262равен263264[`False`](https://python-all.ru/3.0/library/constants.html#False)265266, печатаются только имена элементов. Если он равен267268[`True`](https://python-all.ru/3.0/library/constants.html#True)269270, вывод аналогичен выводу271272**ls -l**273274.275276#### `[tarfile.TarFile.next]TarFile.next()`277278Возвращает следующий элемент архива в виде объекта279280[`TarInfo`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarInfo)281282, когда283284[`TarFile`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarFile)285286открыт для чтения. Возвращает287288[`None`](https://python-all.ru/3.0/library/constants.html#None)289290, если больше нет доступных элементов.291292#### `[tarfile.TarFile.extractall]TarFile.extractall(path=".", members=None)`293294Извлекает все элементы из архива в текущий рабочий каталог или каталог *path*. Если задан необязательный *members*, он должен быть подмножеством списка, возвращаемого [`getmembers()`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarFile.getmembers). Информация о каталоге, такая как владелец, время изменения и права доступа, устанавливается после извлечения всех элементов. Это сделано для обхода двух проблем: время изменения каталога сбрасывается каждый раз, когда в нём создаётся файл. И, если права доступа каталога не разрешают запись, извлечение файлов в него завершится ошибкой.295296> **Предупреждение**297>298> Никогда не извлекайте архивы из ненадёжных источников без предварительной проверки. Возможно создание файлов за пределами *path*, например, элементов с абсолютными именами, начинающимися с `"/"`, или с именами, содержащими две точки `".."`.299300#### `[tarfile.TarFile.extract]TarFile.extract(member, path="")`301302Извлекает элемент архива в текущую рабочую директорию, используя его полное имя. Информация о файле извлекается максимально точно. *member* может быть именем файла или объектом [`TarInfo`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarInfo). Можно указать другую директорию с помощью *path*.303304> **Примечание**305>306> Метод [`extract()`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarFile.extract) не учитывает несколько проблем извлечения. В большинстве случаев следует рассмотреть использование метода [`extractall()`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarFile.extractall).307308> **Предупреждение**309>310> Смотрите предупреждение для [`extractall()`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarFile.extractall).311312#### `[tarfile.TarFile.extractfile]TarFile.extractfile(member)`313314Извлекает элемент из архива в виде файлового объекта. *member* может быть именем файла или объектом [`TarInfo`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarInfo). Если *member* – обычный файл, возвращается объект, похожий на файл. Если *member* – ссылка, такой объект создаётся из цели ссылки. Если *member* не является ни тем, ни другим, возвращается [`None`](https://python-all.ru/3.0/library/constants.html#None).315316> **Примечание**317>318> Файлоподобный объект доступен только для чтения и предоставляет следующие методы: `read()`, `readline()`, `readlines()`, `seek()`, `tell()`.319320#### `[tarfile.TarFile.add]TarFile.add(name, arcname=None, recursive=True, exclude=None)`321322Добавляет файл323324*name*325326в архив.327328*name*329330может быть файлом любого типа (каталог, FIFO, символическая ссылка и т.д.). Если задан,331332*arcname*333334указывает альтернативное имя файла в архиве. По умолчанию каталоги добавляются рекурсивно. Этого можно избежать, установив335336*recursive*337338в339340[`False`](https://python-all.ru/3.0/library/constants.html#False)341342. Если задан343344*exclude*345346, это должна быть функция, принимающая один аргумент – имя файла и возвращающая логическое значение. В зависимости от этого значения соответствующий файл либо исключается (347348[`True`](https://python-all.ru/3.0/library/constants.html#True)349350), либо добавляется (351352[`False`](https://python-all.ru/3.0/library/constants.html#False)353354).355356#### `[tarfile.TarFile.addfile]TarFile.addfile(tarinfo, fileobj=None)`357358Add the [`TarInfo`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarInfo) object *tarinfo* to the archive. If *fileobj* is given, `tarinfo.size` bytes are read from it and added to the archive. You can create [`TarInfo`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarInfo) objects using [`gettarinfo()`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarFile.gettarinfo).359360> **Примечание**361>362> On Windows platforms, *fileobj* should always be opened with mode `'rb'` to avoid irritation about the file size.363364#### `[tarfile.TarFile.gettarinfo]TarFile.gettarinfo(name=None, arcname=None, fileobj=None)`365366Создаёт объект367368[`TarInfo`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarInfo)369370для файла371372*name*373374или файлового объекта375376*fileobj*377378(используя379380[`os.fstat()`](https://python-all.ru/3.0/library/os.html#os.fstat)381382для его файлового дескриптора). Некоторые атрибуты383384[`TarInfo`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarInfo)385386можно изменить перед добавлением с помощью387388[`addfile()`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarFile.addfile)389390. Если указан,391392*arcname*393394задаёт альтернативное имя файла в архиве.395396#### `[tarfile.TarFile.close]TarFile.close()`397398Close the399400[`TarFile`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarFile)401402. In write mode, two finishing zero blocks are appended to the archive.403404#### `[tarfile.TarFile.pax_headers]TarFile.pax_headers`405406Словарь, содержащий пары ключ-значение глобальных заголовков pax.407408## Объекты TarInfo409410A [`TarInfo`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarInfo) object represents one member in a [`TarFile`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarFile). Aside from storing all required attributes of a file (like file type, size, time, permissions, owner etc.), it provides some useful methods to determine its type. It does *not* contain the file’s data itself.411412[`TarInfo`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarInfo) objects are returned by [`TarFile`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarFile)‘s methods `getmember()`, `getmembers()` and `gettarinfo()`.413414#### `[tarfile.TarInfo]class tarfile.TarInfo(name="")`415416Create a417418[`TarInfo`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarInfo)419420object.421422#### `[tarfile.TarInfo.frombuf]TarInfo.frombuf(buf)`423424Create and return a [`TarInfo`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarInfo) object from string buffer *buf*.425426Вызывает [`HeaderError`](https://python-all.ru/3.0/library/tarfile.html#tarfile.HeaderError), если буфер некорректен..427428#### `[tarfile.TarInfo.fromtarfile]TarInfo.fromtarfile(tarfile)`429430Читает следующий элемент из объекта431432[`TarFile`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarFile)433434*tarfile*435436и возвращает его как объект437438[`TarInfo`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarInfo)439440.441442#### `[tarfile.TarInfo.tobuf]TarInfo.tobuf(format=DEFAULT_FORMAT, encoding=ENCODING, errors='strict')`443444Создаёт строковый буфер из объекта445446[`TarInfo`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarInfo)447448. Информацию об аргументах см. в конструкторе класса449450[`TarFile`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarFile)451452.453454Объект `TarInfo` имеет следующие публичные атрибуты данных:455456#### `[tarfile.TarInfo.name]TarInfo.name`457458Имя элемента архива.459460#### `[tarfile.TarInfo.size]TarInfo.size`461462Размер в байтах.463464#### `[tarfile.TarInfo.mtime]TarInfo.mtime`465466Время последнего изменения.467468#### `[tarfile.TarInfo.mode]TarInfo.mode`469470Биты разрешений.471472#### `[tarfile.TarInfo.type]TarInfo.type`473474Тип файла.475476*type*477478обычно является одной из этих констант:479480`REGTYPE`481482,483484`AREGTYPE`485486,487488`LNKTYPE`489490,491492`SYMTYPE`493494,495496`DIRTYPE`497498,499500`FIFOTYPE`501502,503504`CONTTYPE`505506,507508`CHRTYPE`509510,511512`BLKTYPE`513514,515516`GNUTYPE_SPARSE`517518. Для более удобного определения типа объекта519520[`TarInfo`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarInfo)521522используйте методы523524`is_*()`525526ниже.527528#### `[tarfile.TarInfo.linkname]TarInfo.linkname`529530Имя целевого файла, которое присутствует только в объектах531532[`TarInfo`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarInfo)533534типа535536`LNKTYPE`537538и539540`SYMTYPE`541542.543544#### `[tarfile.TarInfo.uid]TarInfo.uid`545546Идентификатор пользователя, который изначально сохранил этот элемент.547548#### `[tarfile.TarInfo.gid]TarInfo.gid`549550Идентификатор группы пользователя, который изначально сохранил этот элемент.551552#### `[tarfile.TarInfo.uname]TarInfo.uname`553554Имя пользователя.555556#### `[tarfile.TarInfo.gname]TarInfo.gname`557558Имя группы.559560#### `[tarfile.TarInfo.pax_headers]TarInfo.pax_headers`561562Словарь, содержащий пары ключ-значение связанного расширенного заголовка pax.563564Объект [`TarInfo`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarInfo) также предоставляет несколько удобных методов для запросов:565566#### `[tarfile.TarInfo.isfile]TarInfo.isfile()`567568Возвращает569570[`True`](https://python-all.ru/3.0/library/constants.html#True)571572, если объект573574`Tarinfo`575576является обычным файлом.577578#### `[tarfile.TarInfo.isreg]TarInfo.isreg()`579580То же, что и581582[`isfile()`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarInfo.isfile)583584.585586#### `[tarfile.TarInfo.isdir]TarInfo.isdir()`587588Возвращает589590[`True`](https://python-all.ru/3.0/library/constants.html#True)591592, если это каталог.593594#### `[tarfile.TarInfo.issym]TarInfo.issym()`595596Возвращает597598[`True`](https://python-all.ru/3.0/library/constants.html#True)599600, если это символическая ссылка.601602#### `[tarfile.TarInfo.islnk]TarInfo.islnk()`603604Возвращает605606[`True`](https://python-all.ru/3.0/library/constants.html#True)607608, если это жёсткая ссылка.609610#### `[tarfile.TarInfo.ischr]TarInfo.ischr()`611612Возвращает613614[`True`](https://python-all.ru/3.0/library/constants.html#True)615616, если это символьное устройство.617618#### `[tarfile.TarInfo.isblk]TarInfo.isblk()`619620Возвращает621622[`True`](https://python-all.ru/3.0/library/constants.html#True)623624, если это блочное устройство.625626#### `[tarfile.TarInfo.isfifo]TarInfo.isfifo()`627628Возвращает629630[`True`](https://python-all.ru/3.0/library/constants.html#True)631632, если это FIFO.633634#### `[tarfile.TarInfo.isdev]TarInfo.isdev()`635636Возвращает637638[`True`](https://python-all.ru/3.0/library/constants.html#True)639640, если это символьное устройство, блочное устройство или FIFO.641642## Примеры643644Как извлечь полный tar-архив в текущий рабочий каталог:645646```python647import tarfile648tar = tarfile.open("sample.tar.gz")649tar.extractall()650tar.close()651```652653Как извлечь подмножество tar-архива с помощью [`TarFile.extractall()`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarFile.extractall), используя функцию-генератор вместо списка:654655```python656import os657import tarfile658659def py_files(members):660 for tarinfo in members:661 if os.path.splitext(tarinfo.name)[1] == ".py":662 yield tarinfo663664tar = tarfile.open("sample.tar.gz")665tar.extractall(members=py_files(tar))666tar.close()667```668669Как создать несжатый tar-архив из списка имён файлов:670671```python672import tarfile673tar = tarfile.open("sample.tar", "w")674for name in ["foo", "bar", "quux"]:675 tar.add(name)676tar.close()677```678679Как прочитать tar-архив, сжатый gzip, и вывести информацию о некоторых элементах:680681```python682import tarfile683tar = tarfile.open("sample.tar.gz", "r:gz")684for tarinfo in tar:685 print(tarinfo.name, "is", tarinfo.size, "bytes in size and is", end="")686 if tarinfo.isreg():687 print("a regular file.")688 elif tarinfo.isdir():689 print("a directory.")690 else:691 print("something else.")692tar.close()693```694695## Поддерживаемые форматы tar696697Есть три формата tar, которые можно создать с помощью модуля `tarfile`:698699- Формат POSIX.1-1988 ustar ([`USTAR_FORMAT`](https://python-all.ru/3.0/library/tarfile.html#tarfile.USTAR_FORMAT)). Он поддерживает имена файлов длиной до 256 символов и имена ссылок до 100 символов. Максимальный размер файла – 8 гигабайт. Это старый и ограниченный, но широко поддерживаемый формат.700- Формат GNU tar ([`GNU_FORMAT`](https://python-all.ru/3.0/library/tarfile.html#tarfile.GNU_FORMAT)). Он поддерживает длинные имена файлов и имена ссылок, файлы размером более 8 гигабайт и разреженные файлы. Это фактический стандарт в системах GNU/Linux. `tarfile` полностью поддерживает расширения GNU tar для длинных имён, поддержка разреженных файлов доступна только для чтения.701- Формат pax POSIX.1-2001 ([`PAX_FORMAT`](https://python-all.ru/3.0/library/tarfile.html#tarfile.PAX_FORMAT)). Это наиболее гибкий формат, практически без ограничений. Он поддерживает длинные имена файлов и ссылок, большие файлы и хранит пути переносимым образом. Однако не все современные реализации tar умеют корректно обрабатывать архивы pax.702703 Формат *pax* является расширением существующего формата *ustar*. Он использует дополнительные заголовки для информации, которую иначе сохранить невозможно. Существует две разновидности pax-заголовков: расширенные заголовки действуют только на последующий заголовок файла, а глобальные заголовки действительны для всего архива и влияют на все последующие файлы. Все данные в pax-заголовке для портативности кодируются в *UTF-8*.704705Существуют ещё некоторые варианты формата tar, которые можно читать, но не создавать:706707- Древний формат V7. Это первый формат tar из Unix Seventh Edition, хранящий только обычные файлы и каталоги. Имена не должны быть длиннее 100 символов, информация об имени пользователя/группы отсутствует. Некоторые архивы имеют неправильные контрольные суммы заголовков в случае полей с не-ASCII символами.708- Расширенный формат SunOS tar. Этот формат является вариантом формата POSIX.1-2001 pax, но несовместим с ним.709710## Проблемы Unicode711712Формат tar изначально был задуман для создания резервных копий на ленточных накопителях с основным упором на сохранение информации о файловой системе. Сегодня tar-архивы обычно используются для распространения файлов и обмена архивами по сетям. Одна проблема исходного формата (который является основой всех других форматов) заключается в том, что нет концепции поддержки разных кодировок символов. Например, обычный tar-архив, созданный в системе с *UTF-8*, не может быть корректно прочитан в системе с *Latin-1*, если он содержит символы, отличные от *ASCII*. Текстовые метаданные (например, имена файлов, имена ссылок, имена пользователей/групп) будут повреждены. К сожалению, нет способа автоматически определить кодировку архива. Формат pax был разработан для решения этой проблемы. Он хранит не-ASCII метаданные, используя универсальную кодировку символов *UTF-8*.713714Детали преобразования символов в `tarfile` управляются ключевыми аргументами *encoding* и *errors* класса [`TarFile`](https://python-all.ru/3.0/library/tarfile.html#tarfile.TarFile).715716*encoding* определяет кодировку символов для метаданных в архиве. Значение по умолчанию – [`sys.getfilesystemencoding()`](https://python-all.ru/3.0/library/sys.html#sys.getfilesystemencoding) или `'ascii'` в качестве запасного варианта. В зависимости от того, читается архив или записывается, метаданные должны быть декодированы или закодированы. Если *encoding* задан неподходящим образом, это преобразование может завершиться ошибкой.717718Аргумент *errors* определяет, как обрабатываются символы, которые невозможно преобразовать. Возможные значения перечислены в разделе [*Базовые классы кодеков*](https://python-all.ru/3.0/library/codecs.html#codec-base-classes). В режиме чтения по умолчанию используется схема `'replace'`. Это позволяет избежать неожиданных исключений [`UnicodeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.UnicodeError) и гарантирует, что архив всегда может быть прочитан. В режиме записи значение по умолчанию для *errors* – `'strict'`. Это гарантирует, что информация об именах не будет изменена незаметно.719720При записи архивов формата [`PAX_FORMAT`](https://python-all.ru/3.0/library/tarfile.html#tarfile.PAX_FORMAT) аргумент *encoding* игнорируется, поскольку не-ASCII метаданные хранятся с использованием *UTF-8*.721