tarfile.md
1> **Источник:** https://python-all.ru/2.7/library/tarfile.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 12.5. [`tarfile`](https://python-all.ru/2.7/library/tarfile.html#module-tarfile) – Чтение и запись tar-архивов89Новое в версии 2.3.1011**Исходный код:** [Lib/tarfile.py](https://python-all.ru/src/2.7/Lib/tarfile.py)1213---1415Модуль [`tarfile`](https://python-all.ru/2.7/library/tarfile.html#module-tarfile) позволяет читать и записывать tar- архивы, включая архивы, сжатые с помощью gzip или bz2. Используйте модуль [`zipfile`](https://python-all.ru/2.7/library/zipfile.html#module-zipfile) для чтения или записи файлов `.zip` или функции более высокого уровня из [shutil](https://python-all.ru/2.7/library/shutil.html#archiving-operations).1617Некоторые факты и цифры:1819- читает и записывает архивы, сжатые с помощью [`gzip`](https://python-all.ru/2.7/library/gzip.html#module-gzip) и [`bz2`](https://python-all.ru/2.7/library/bz2.html#module-bz2), если соответствующие модули доступны.20- поддержка чтения/записи формата POSIX.1-1988 (ustar).21- поддержка чтения/записи для формата GNU tar, включая расширения *longname* и *longlink*, поддержка только чтения для расширения *sparse*.22- поддержка чтения/записи формата POSIX.1-2001 (pax).2324 Новое в версии 2.6.25- работает с директориями, обычными файлами, жёсткими ссылками, символическими ссылками, каналами FIFO, символьными и блочными устройствами, а также может получать и восстанавливать информацию о файлах, такую как временная метка, права доступа и владелец.2627> **Примечание**28>29> Обработка многопотоковых bzip2 файлов не поддерживается. Такие модули, как [bz2file](https://python-all.ru/2.7/library/tarfile.html), позволяют обойти это ограничение.3031#### `tarfile.open(name=None, mode='r', fileobj=None, bufsize=10240, **kwargs)`3233Возвращает объект [`TarFile`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarFile) для имени пути *name*. Подробную информацию об объектах [`TarFile`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarFile) и допустимых именованных аргументах см. в разделе [Объекты TarFile](https://python-all.ru/2.7/library/tarfile.html#tarfile-objects).3435*mode* должен быть строкой вида `'filemode[:compression]'`, по умолчанию равен `'r'`. Вот полный список комбинаций режимов:3637| Режим | Действие |38| --- | --- |39| `'r' or 'r:*'` | Открыть для чтения с прозрачным сжатием (рекомендуется). |40| `'r:'` | Открыть для чтения исключительно без сжатия. |41| `'r:gz'` | Открыть для чтения со сжатием gzip. |42| `'r:bz2'` | Открыть для чтения со сжатием bzip2. |43| `'a' or 'a:'` | Открыть для добавления без сжатия. Файл создаётся, если он не существует. |44| `'w' or 'w:'` | Открывается для записи без сжатия. |45| `'w:gz'` | Открывается для записи со сжатием gzip. |46| `'w:bz2'` | Открывается для записи со сжатием bzip2. |4748Обратите внимание, что `'a:gz'` или `'a:bz2'` невозможно. Если *mode* не подходит для открытия определённого (сжатого) файла для чтения, возбуждается исключение [`ReadError`](https://python-all.ru/2.7/library/tarfile.html#tarfile.ReadError). Используйте *mode* `'r'`, чтобы избежать этого. Если метод сжатия не поддерживается, возбуждается [`CompressionError`](https://python-all.ru/2.7/library/tarfile.html#tarfile.CompressionError).4950Если указан *fileobj*, он используется вместо файлового объекта, открытого для *name*. Предполагается, что он находится в позиции 0.5152Для режимов `'w:gz'`, `'r:gz'`, `'w:bz2'`, `'r:bz2'`, [`tarfile.open()`](https://python-all.ru/2.7/library/tarfile.html#tarfile.open) принимает ключевой аргумент *compresslevel* (по умолчанию `9`) для указания уровня сжатия файла.5354Для специальных целей существует второй формат для *mode*: `'filemode|[compression]'`. [`tarfile.open()`](https://python-all.ru/2.7/library/tarfile.html#tarfile.open) вернёт объект [`TarFile`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarFile), который обрабатывает свои данные как поток блоков. Произвольный доступ к файлу выполняться не будет. Если задан, *fileobj* может быть любым объектом, имеющим метод `read()` или `write()` (в зависимости от *mode*). *bufsize* задаёт размер блока и по умолчанию равен `20 * 512` байт. Используйте этот вариант в сочетании, например, с `sys.stdin`, файловым объектом сокета или ленточным устройством. Однако такой объект [`TarFile`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarFile) ограничен тем, что не допускает произвольного доступа, см. [Примеры](https://python-all.ru/2.7/library/tarfile.html#tar-examples). Возможные в настоящее время режимы:5556| Режим | Действие |57| --- | --- |58| `'r\|*'` | Открывает *поток данных* tar-блоков для чтения с прозрачным сжатием. |59| `'r\|'` | Открывает *поток данных* несжатых tar-блоков для чтения. |60| `'r\|gz'` | Открывает сжатый gzip *поток данных* для чтения. |61| `'r\|bz2'` | Открывает сжатый bzip2 *поток данных* для чтения. |62| `'w\|'` | Открывает несжатый *поток данных* для записи. |63| `'w\|gz'` | Открывает сжатый gzip *поток данных* для записи. |64| `'w\|bz2'` | Открывает сжатый bzip2 *поток данных* для записи. |6566#### `class tarfile.TarFile`6768Класс для чтения и записи tar-архивов. Не используйте этот класс напрямую, лучше используйте [`tarfile.open()`](https://python-all.ru/2.7/library/tarfile.html#tarfile.open). См. [Объекты TarFile](https://python-all.ru/2.7/library/tarfile.html#tarfile-objects).6970#### `tarfile.is_tarfile(name)`7172Возвращает [`True`](https://python-all.ru/2.7/library/constants.html#True), если *name* является tar-архивом, который может прочитать модуль [`tarfile`](https://python-all.ru/2.7/library/tarfile.html#module-tarfile).7374#### `class tarfile.TarFileCompat(filename, mode='r', compression=TAR_PLAIN)`7576Класс для ограниченного доступа к tar-архивам с интерфейсом, подобным [`zipfile`](https://python-all.ru/2.7/library/zipfile.html#module-zipfile). Пожалуйста, обратитесь к документации модуля [`zipfile`](https://python-all.ru/2.7/library/zipfile.html#module-zipfile) для получения дополнительных сведений. *compression* должно быть одной из следующих констант:7778#### `TAR_PLAIN`7980Константа для несжатого tar-архива.8182#### `TAR_GZIPPED`8384Константа для tar-архива, сжатого с помощью [`gzip`](https://python-all.ru/2.7/library/gzip.html#module-gzip).8586Устарело с версии 2.6: Класс [`TarFileCompat`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarFileCompat) удалён в Python 3.8788#### `exception tarfile.TarError`8990Базовый класс для всех исключений [`tarfile`](https://python-all.ru/2.7/library/tarfile.html#module-tarfile).9192#### `exception tarfile.ReadError`9394Возникает при открытии tar-архива, который не может быть обработан модулем [`tarfile`](https://python-all.ru/2.7/library/tarfile.html#module-tarfile) или является некорректным.9596#### `exception tarfile.CompressionError`9798Возникает, когда метод сжатия не поддерживается или данные не удаётся корректно декодировать.99100#### `exception tarfile.StreamError`101102Возникает при ограничениях, типичных для объектов, работающих в режиме потока [`TarFile`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarFile).103104#### `exception tarfile.ExtractError`105106Возникает при *нефатальных* ошибках при использовании [`TarFile.extract()`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarFile.extract), но только если `TarFile.errorlevel``== 2`.107108На уровне модуля доступны следующие константы:109110#### `tarfile.ENCODING`111112Кодировка символов по умолчанию: `'utf-8'` в Windows, значение, возвращаемое [`sys.getfilesystemencoding()`](https://python-all.ru/2.7/library/sys.html#sys.getfilesystemencoding) в остальных случаях.113114#### `exception tarfile.HeaderError`115116Возникает при вызове [`TarInfo.frombuf()`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarInfo.frombuf), если полученный буфер некорректен.117118Новое в версии 2.6.119120Каждая из следующих констант определяет формат tar-архива, который модуль [`tarfile`](https://python-all.ru/2.7/library/tarfile.html#module-tarfile) может создавать. Подробнее см. раздел [Поддерживаемые форматы tar](https://python-all.ru/2.7/library/tarfile.html#tar-formats) для получения подробностей.121122#### `tarfile.USTAR_FORMAT`123124Формат POSIX.1-1988 (ustar).125126#### `tarfile.GNU_FORMAT`127128Формат GNU tar.129130#### `tarfile.PAX_FORMAT`131132Формат POSIX.1-2001 (pax).133134#### `tarfile.DEFAULT_FORMAT`135136Формат по умолчанию для создания архивов. В настоящее время это [`GNU_FORMAT`](https://python-all.ru/2.7/library/tarfile.html#tarfile.GNU_FORMAT).137138> **См. также**139>140> **Модуль [`zipfile`](https://python-all.ru/2.7/library/zipfile.html#module-zipfile)**141>142> Документация стандартного модуля [`zipfile`](https://python-all.ru/2.7/library/zipfile.html#module-zipfile).143>144> **[Операции архивирования](https://python-all.ru/2.7/library/shutil.html#archiving-operations)**145>146> Документация средств архивирования высокого уровня, предоставляемых стандартным модулем [`shutil`](https://python-all.ru/2.7/library/shutil.html#module-shutil).147>148> **[Руководство GNU tar, базовый формат tar](https://python-all.ru/2.7/library/tarfile.html)**149>150> Документация для файлов архивов tar, включая расширения GNU tar.151152## 12.5.1. Объекты TarFile153154Объект [`TarFile`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarFile) предоставляет интерфейс к архиву tar. Архив tar представляет собой последовательность блоков. Элемент архива (хранимый файл) состоит из заголовочного блока, за которым следуют блоки данных. Файл можно сохранить в архив tar несколько раз. Каждый элемент архива представляется объектом [`TarInfo`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarInfo), подробнее см. [Объекты TarInfo](https://python-all.ru/2.7/library/tarfile.html#tarinfo-objects).155156Объект [`TarFile`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarFile) можно использовать как контекстный менеджер в операторе [`with`](https://python-all.ru/2.7/reference/compound_stmts.html#with). Он будет автоматически закрыт по завершении блока. Обратите внимание: в случае исключения архив, открытый для записи, не будет финализирован; будет закрыт только внутренний файловый объект. Пример использования см. в разделе [Примеры](https://python-all.ru/2.7/library/tarfile.html#tar-examples).157158Новое в версии 2.7: Добавлена поддержка протокола менеджера контекста.159160#### `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)`161162Все последующие аргументы необязательны и также могут быть доступны как атрибуты экземпляра.163164*name* – это путь к архиву. Его можно опустить, если указан *fileobj*. В этом случае используется атрибут `name` файлового объекта, если он существует.165166*mode* может быть `'r'` для чтения из существующего архива, `'a'` для добавления данных в существующий файл или `'w'` для создания нового файла с перезаписью существующего.167168Если указан *fileobj*, он используется для чтения или записи данных. Если это можно определить, *mode* переопределяется режимом *fileobj*. *fileobj* будет использоваться с позиции 0.169170> **Примечание**171>172> *fileobj* не закрывается при закрытии [`TarFile`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarFile).173174*format* управляет форматом архива. Значением должна быть одна из констант [`USTAR_FORMAT`](https://python-all.ru/2.7/library/tarfile.html#tarfile.USTAR_FORMAT), [`GNU_FORMAT`](https://python-all.ru/2.7/library/tarfile.html#tarfile.GNU_FORMAT) или [`PAX_FORMAT`](https://python-all.ru/2.7/library/tarfile.html#tarfile.PAX_FORMAT), определённых на уровне модуля.175176Новое в версии 2.6.177178Аргумент *tarinfo* можно использовать для замены класса по умолчанию [`TarInfo`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarInfo) на другой.179180Новое в версии 2.6.181182Если *dereference* равно [`False`](https://python-all.ru/2.7/library/constants.html#False), в архив добавляются символические и жёсткие ссылки. Если [`True`](https://python-all.ru/2.7/library/constants.html#True), в архив добавляется содержимое целевых файлов. Это не влияет на системы, не поддерживающие символические ссылки.183184Если *ignore\_zeros* равно [`False`](https://python-all.ru/2.7/library/constants.html#False), пустой блок считается концом архива. Если [`True`](https://python-all.ru/2.7/library/constants.html#True), пустые (и недействительные) блоки пропускаются, и предпринимается попытка получить как можно больше элементов. Это полезно только для чтения объединённых или повреждённых архивов.185186*debug* может быть установлен от `0` (нет отладочных сообщений) до `3` (все отладочные сообщения). Сообщения записываются в `sys.stderr`.187188Если *errorlevel* равно `0`, все ошибки игнорируются при использовании [`TarFile.extract()`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarFile.extract). Тем не менее, они отображаются как сообщения об ошибках в отладочном выводе, если отладка включена. Если `1`, все *фатальные* ошибки возбуждаются как исключения [`OSError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.OSError) или [`IOError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.IOError). Если `2`, все *нефатальные* ошибки также возбуждаются как исключения [`TarError`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarError).189190Аргументы *encoding* и *errors* управляют способом преобразования строк в объекты Unicode и обратно. Настройки по умолчанию подойдут большинству пользователей. См. раздел [Проблемы Unicode](https://python-all.ru/2.7/library/tarfile.html#tar-unicode) для получения подробной информации.191192Новое в версии 2.6.193194Аргумент *pax\_headers* – это необязательный словарь строк Unicode, который будет добавлен как глобальный заголовок pax, если *format* равен [`PAX_FORMAT`](https://python-all.ru/2.7/library/tarfile.html#tarfile.PAX_FORMAT).195196Новое в версии 2.6.197198#### `classmethod TarFile.open(...)`199200Альтернативный конструктор. Функция [`tarfile.open()`](https://python-all.ru/2.7/library/tarfile.html#tarfile.open) на самом деле является сокращением для этого метода класса.201202#### `TarFile.getmember(name)`203204Возвращает объект [`TarInfo`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarInfo) для элемента *name*. Если *name* не найден в архиве, возбуждается [`KeyError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.KeyError).205206> **Примечание**207>208> Если элемент встречается в архиве более одного раза, последнее его вхождение считается самой актуальной версией.209210#### `TarFile.getmembers()`211212Возвращает элементы архива в виде списка объектов [`TarInfo`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarInfo). Порядок списка соответствует порядку элементов в архиве.213214#### `TarFile.getnames()`215216Возвращает элементы в виде списка их имён. Порядок списка соответствует порядку списка, возвращаемого [`getmembers()`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarFile.getmembers).217218#### `TarFile.list(verbose=True)`219220Выводит оглавление в `sys.stdout`. Если *verbose* равно [`False`](https://python-all.ru/2.7/library/constants.html#False), печатаются только имена членов архива. Если равно [`True`](https://python-all.ru/2.7/library/constants.html#True), выводится результат, аналогичный выводу **ls -l**.221222#### `TarFile.next()`223224Возвращает следующий элемент архива в виде объекта [`TarInfo`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarInfo), когда [`TarFile`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarFile) открыт для чтения. Если больше нет элементов, возвращает [`None`](https://python-all.ru/2.7/library/constants.html#None).225226#### `TarFile.extractall(path=".", members=None)`227228Извлекает все элементы из архива в текущую рабочую директорию или в директорию *path*. Если задан необязательный параметр *members*, он должен быть подмножеством списка, возвращаемого [`getmembers()`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarFile.getmembers). Сведения о директории (владелец, время изменения, права доступа) устанавливаются после извлечения всех элементов. Это сделано для обхода двух проблем: время изменения директории сбрасывается при каждом создании в ней файла, и если права директории не разрешают запись, извлечение в неё файлов завершится ошибкой.229230> **Предупреждение**231>232> Никогда не извлекайте архивы из ненадёжных источников без предварительной проверки. Возможно создание файлов за пределами *path*, например, элементов с абсолютными именами, начинающимися с `"/"`, или с именами, содержащими две точки `".."`.233234Новое в версии 2.5.235236#### `TarFile.extract(member, path="")`237238Извлекает элемент архива в текущий рабочий каталог, используя его полное имя. Информация о файле извлекается максимально точно. *member* может быть именем файла или объектом [`TarInfo`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarInfo). Можно указать другой каталог с помощью *path*.239240> **Примечание**241>242> Метод [`extract()`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarFile.extract) не решает ряд проблем извлечения. В большинстве случаев стоит рассмотреть использование метода [`extractall()`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarFile.extractall).243244> **Предупреждение**245>246> См. предупреждение для [`extractall()`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarFile.extractall).247248#### `TarFile.extractfile(member)`249250Извлекает элемент архива в виде файлового объекта. *member* может быть именем файла или объектом [`TarInfo`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarInfo). Если *member* является обычным файлом, возвращается объект, подобный файлу. Если *member* является ссылкой, файлоподобный объект создаётся из цели ссылки. Если *member* не является ни тем, ни другим, возвращается [`None`](https://python-all.ru/2.7/library/constants.html#None).251252> **Примечание**253>254> Файлоподобный объект доступен только для чтения. Он предоставляет методы `read()`, [`readline()`](https://python-all.ru/2.7/library/readline.html#module-readline), `readlines()`, `seek()`, `tell()` и [`close()`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarFile.close), а также поддерживает итерацию по своим строкам.255256#### `TarFile.add(name, arcname=None, recursive=True, exclude=None, filter=None)`257258Добавляет файл *name* в архив. *name* может быть файлом любого типа (каталог, FIFO, символическая ссылка и т.д.). Если задано, *arcname* указывает альтернативное имя для файла в архиве. Каталоги добавляются рекурсивно по умолчанию. Этого можно избежать, установив *recursive* в [`False`](https://python-all.ru/2.7/library/constants.html#False). Если задан *exclude*, это должна быть функция, принимающая один аргумент – имя файла – и возвращающая логическое значение. В зависимости от этого значения соответствующий файл либо исключается ([`True`](https://python-all.ru/2.7/library/constants.html#True)), либо добавляется ([`False`](https://python-all.ru/2.7/library/constants.html#False)). Если указан *filter*, это должна быть функция, принимающая аргумент-объект [`TarInfo`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarInfo) и возвращающая изменённый объект [`TarInfo`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarInfo). Если вместо этого она возвращает [`None`](https://python-all.ru/2.7/library/constants.html#None), объект [`TarInfo`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarInfo) будет исключён из архива. См. [Примеры](https://python-all.ru/2.7/library/tarfile.html#tar-examples) для примера.259260Изменено в версии 2.6: Добавлен параметр *exclude*.261262Изменено в версии 2.7: Добавлен параметр *filter*.263264Устарело с версии 2.7: Параметр *exclude* устарел, пожалуйста, используйте вместо него параметр *filter*. Для максимальной переносимости *filter* следует использовать как ключевой аргумент, а не как позиционный, чтобы код не пострадал, когда *exclude* будет окончательно удалён.265266#### `TarFile.addfile(tarinfo, fileobj=None)`267268Добавляет объект [`TarInfo`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarInfo) *tarinfo* в архив. Если указан *fileobj*, из него читаются `tarinfo.size` байт и добавляются в архив. Можно создавать объекты [`TarInfo`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarInfo) напрямую или с помощью [`gettarinfo()`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarFile.gettarinfo).269270> **Примечание**271>272> На платформах Windows *fileobj* следует всегда открывать с режимом `'rb'`, чтобы избежать проблем с размером файла.273274#### `TarFile.gettarinfo(name=None, arcname=None, fileobj=None)`275276Создаёт объект [`TarInfo`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarInfo) из результата [`os.stat()`](https://python-all.ru/2.7/library/os.html#os.stat) или эквивалентного вызова для существующего файла. Файл задаётся либо именем *name*, либо объектом файла *fileobj* с файловым дескриптором. Если задан, *arcname* указывает альтернативное имя для файла в архиве; в противном случае имя берётся из атрибута [`name`](https://python-all.ru/2.7/library/stdtypes.html#file.name) объекта *fileobj* или из аргумента *name*.277278Можно изменить некоторые атрибуты объекта [`TarInfo`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarInfo) перед его добавлением с помощью [`addfile()`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarFile.addfile). Если файловый объект не является обычным файловым объектом, расположенным в начале файла, может потребоваться изменить такие атрибуты, как [`size`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarInfo.size). Это относится к объектам типа [`GzipFile`](https://python-all.ru/2.7/library/gzip.html#gzip.GzipFile). [`name`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarInfo.name) также может быть изменён, и в этом случае *arcname* может быть фиктивной строкой.279280#### `TarFile.close()`281282Закрывает [`TarFile`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarFile). В режиме записи в архив добавляются два завершающих нулевых блока.283284#### `TarFile.posix`285286Установка этого в [`True`](https://python-all.ru/2.7/library/constants.html#True) эквивалентна установке атрибута [`format`](https://python-all.ru/2.7/library/functions.html#format) в [`USTAR_FORMAT`](https://python-all.ru/2.7/library/tarfile.html#tarfile.USTAR_FORMAT), а [`False`](https://python-all.ru/2.7/library/constants.html#False) эквивалентно [`GNU_FORMAT`](https://python-all.ru/2.7/library/tarfile.html#tarfile.GNU_FORMAT).287288Изменено в версии 2.4: *posix* по умолчанию равен [`False`](https://python-all.ru/2.7/library/constants.html#False).289290Устарело с версии 2.6: Вместо этого используйте атрибут [`format`](https://python-all.ru/2.7/library/functions.html#format).291292#### `TarFile.pax_headers`293294Словарь, содержащий пары ключ-значение глобальных заголовков pax.295296Новое в версии 2.6.297298## 12.5.2. Объекты TarInfo299300Объект [`TarInfo`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarInfo) представляет один элемент в [`TarFile`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarFile). Помимо хранения всех необходимых атрибутов файла (таких как тип, размер, время, права доступа, владелец и т.д.), он предоставляет некоторые полезные методы для определения его типа. Он *не* содержит сами данные файла.301302[`TarInfo`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarInfo) возвращаются методами [`TarFile`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarFile): `getmember()`, `getmembers()` и `gettarinfo()`.303304#### `class tarfile.TarInfo(name="")`305306Создаёт объект [`TarInfo`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarInfo).307308#### `TarInfo.frombuf(buf)`309310Создаёт и возвращает объект [`TarInfo`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarInfo) из строкового буфера *buf*.311312Новое в версии 2.6: Вызывает [`HeaderError`](https://python-all.ru/2.7/library/tarfile.html#tarfile.HeaderError), если буфер недействителен..313314#### `TarInfo.fromtarfile(tarfile)`315316Читает следующий элемент из объекта [`TarFile`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarFile) *tarfile* и возвращает его в виде объекта [`TarInfo`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarInfo).317318Новое в версии 2.6.319320#### `TarInfo.tobuf(format=DEFAULT_FORMAT, encoding=ENCODING, errors='strict')`321322Создаёт строковый буфер из объекта [`TarInfo`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarInfo). Подробнее об аргументах см. конструктор класса [`TarFile`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarFile).323324Изменено в версии 2.6: Аргументы были добавлены.325326Объект `TarInfo` имеет следующие открытые атрибуты данных:327328#### `TarInfo.name`329330Имя элемента архива.331332#### `TarInfo.size`333334Размер в байтах.335336#### `TarInfo.mtime`337338Время последнего изменения.339340#### `TarInfo.mode`341342Биты разрешений.343344#### `TarInfo.type`345346Тип файла. Обычно *type* – это одна из следующих констант: `REGTYPE`, `AREGTYPE`, `LNKTYPE`, `SYMTYPE`, `DIRTYPE`, `FIFOTYPE`, `CONTTYPE`, `CHRTYPE`, `BLKTYPE`, `GNUTYPE_SPARSE`. Чтобы более удобно определить тип объекта [`TarInfo`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarInfo), используйте методы `is*()`, описанные ниже.347348#### `TarInfo.linkname`349350Имя целевого файла, которое присутствует только в объектах [`TarInfo`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarInfo) типов `LNKTYPE` и `SYMTYPE`.351352#### `TarInfo.uid`353354Идентификатор пользователя, который изначально сохранил этот элемент.355356#### `TarInfo.gid`357358Идентификатор группы пользователя, который изначально сохранил этот элемент.359360#### `TarInfo.uname`361362Имя пользователя.363364#### `TarInfo.gname`365366Имя группы.367368#### `TarInfo.pax_headers`369370Словарь, содержащий пары ключ-значение связанного расширенного заголовка pax.371372Новое в версии 2.6.373374Объект [`TarInfo`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarInfo) также предоставляет несколько удобных запросных методов:375376#### `TarInfo.isfile()`377378Возвращает [`True`](https://python-all.ru/2.7/library/constants.html#True), если объект `Tarinfo` является обычным файлом.379380#### `TarInfo.isreg()`381382То же, что и [`isfile()`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarInfo.isfile).383384#### `TarInfo.isdir()`385386Возвращает [`True`](https://python-all.ru/2.7/library/constants.html#True), если это каталог.387388#### `TarInfo.issym()`389390Возвращает [`True`](https://python-all.ru/2.7/library/constants.html#True), если это символическая ссылка.391392#### `TarInfo.islnk()`393394Возвращает [`True`](https://python-all.ru/2.7/library/constants.html#True), если это жёсткая ссылка.395396#### `TarInfo.ischr()`397398Возвращает [`True`](https://python-all.ru/2.7/library/constants.html#True), если это символьное устройство.399400#### `TarInfo.isblk()`401402Возвращает [`True`](https://python-all.ru/2.7/library/constants.html#True), если это блочное устройство.403404#### `TarInfo.isfifo()`405406Возвращает [`True`](https://python-all.ru/2.7/library/constants.html#True), если это FIFO.407408#### `TarInfo.isdev()`409410Возвращает [`True`](https://python-all.ru/2.7/library/constants.html#True), если это символьное устройство, блочное устройство или FIFO.411412## 12.5.3. Примеры413414Как извлечь полный tar-архив в текущий рабочий каталог:415416```python417import tarfile418tar = tarfile.open("sample.tar.gz")419tar.extractall()420tar.close()421```422423Как извлечь подмножество tar-архива с помощью [`TarFile.extractall()`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarFile.extractall), используя функцию-генератор вместо списка:424425```python426import os427import tarfile428429def py_files(members):430 for tarinfo in members:431 if os.path.splitext(tarinfo.name)[1] == ".py":432 yield tarinfo433434tar = tarfile.open("sample.tar.gz")435tar.extractall(members=py_files(tar))436tar.close()437```438439Как создать несжатый tar-архив из списка имён файлов:440441```python442import tarfile443tar = tarfile.open("sample.tar", "w")444for name in ["foo", "bar", "quux"]:445 tar.add(name)446tar.close()447```448449Тот же пример с использованием оператора [`with`](https://python-all.ru/2.7/reference/compound_stmts.html#with):450451```python452import tarfile453with tarfile.open("sample.tar", "w") as tar:454 for name in ["foo", "bar", "quux"]:455 tar.add(name)456```457458Как прочитать tar-архив, сжатый gzip, и вывести информацию о некоторых элементах:459460```python461import tarfile462tar = tarfile.open("sample.tar.gz", "r:gz")463for tarinfo in tar:464 print tarinfo.name, "is", tarinfo.size, "bytes in size and is",465 if tarinfo.isreg():466 print "a regular file."467 elif tarinfo.isdir():468 print "a directory."469 else:470 print "something else."471tar.close()472```473474Как создать архив и сбросить информацию о пользователе, используя параметр *фильтр* в [`TarFile.add()`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarFile.add):475476```python477import tarfile478def reset(tarinfo):479 tarinfo.uid = tarinfo.gid = 0480 tarinfo.uname = tarinfo.gname = "root"481 return tarinfo482tar = tarfile.open("sample.tar.gz", "w:gz")483tar.add("foo", filter=reset)484tar.close()485```486487## 12.5.4. Поддерживаемые форматы tar488489Существует три формата tar, которые можно создать с помощью модуля [`tarfile`](https://python-all.ru/2.7/library/tarfile.html#module-tarfile):490491- Формат POSIX.1-1988 ustar ([`USTAR_FORMAT`](https://python-all.ru/2.7/library/tarfile.html#tarfile.USTAR_FORMAT)). Он поддерживает имена файлов длиной до 256 символов и имена ссылок до 100 символов. Максимальный размер файла – 8 гигабайт. Это старый и ограниченный, но широко поддерживаемый формат.492- Формат GNU tar ([`GNU_FORMAT`](https://python-all.ru/2.7/library/tarfile.html#tarfile.GNU_FORMAT)). Он поддерживает длинные имена файлов и ссылок, файлы размером более 8 гигабайт и разрежённые файлы. Это де-факто стандарт в системах GNU/Linux. [`tarfile`](https://python-all.ru/2.7/library/tarfile.html#module-tarfile) полностью поддерживает расширения GNU tar для длинных имён, поддержка разрежённых файлов доступна только для чтения.493- Формат pax POSIX.1-2001 ([`PAX_FORMAT`](https://python-all.ru/2.7/library/tarfile.html#tarfile.PAX_FORMAT)). Это самый гибкий формат, практически без ограничений. Поддерживает длинные имена файлов и ссылок, большие файлы и хранит пути портативным образом. Однако не все современные реализации tar умеют правильно обрабатывать pax-архивы.494495 Формат *pax* является расширением существующего формата *ustar*. Он использует дополнительные заголовки для информации, которую иначе сохранить невозможно. Существует две разновидности pax-заголовков: расширенные заголовки действуют только на последующий заголовок файла, а глобальные заголовки действительны для всего архива и влияют на все последующие файлы. Все данные в pax-заголовке для портативности кодируются в *UTF-8*.496497Существуют ещё некоторые варианты формата tar, которые можно читать, но не создавать:498499- Древний формат V7. Это первый формат tar из Unix Seventh Edition, хранящий только обычные файлы и каталоги. Имена не должны быть длиннее 100 символов, информация об имени пользователя/группы отсутствует. Некоторые архивы имеют неправильные контрольные суммы заголовков в случае полей с не-ASCII символами.500- Расширенный формат SunOS tar. Этот формат является вариантом формата POSIX.1-2001 pax, но несовместим с ним.501502## 12.5.5. Проблемы с Unicode503504Формат tar изначально был разработан для создания резервных копий на накопителях с основной целью сохранения информации файловой системы. В настоящее время tar-архивы широко используются для распространения файлов и обмена архивами по сетям. Одна из проблем исходного формата (от которого все остальные форматы являются лишь вариантами) заключается в отсутствии поддержки различных кодировок символов. Например, обычный tar-архив, созданный в системе с кодировкой *UTF-8*, не может быть правильно прочитан в системе с кодировкой *Latin-1*, если он содержит символы не из ASCII. Имена (т.е. имена файлов, имена ссылок, имена пользователей/групп), содержащие такие символы, будут отображаться повреждёнными. К сожалению, нет способа автоматического определения кодировки архива.505506Формат pax был разработан для решения этой проблемы. Он хранит имена, отличные от ASCII, используя универсальную кодировку символов *UTF-8*. При чтении pax-архива эти имена в *UTF-8* преобразуются в кодировку локальной файловой системы.507508Детали преобразования Unicode управляются именованными аргументами *encoding* и *errors* класса [`TarFile`](https://python-all.ru/2.7/library/tarfile.html#tarfile.TarFile).509510Значением по умолчанию для *encoding* является локальная кодировка символов. Она определяется из [`sys.getfilesystemencoding()`](https://python-all.ru/2.7/library/sys.html#sys.getfilesystemencoding) и [`sys.getdefaultencoding()`](https://python-all.ru/2.7/library/sys.html#sys.getdefaultencoding). В режиме чтения *encoding* используется исключительно для преобразования имён в Unicode из pax-архива в строки локальной кодировки. В режиме записи использование *encoding* зависит от выбранного формата архива. В случае [`PAX_FORMAT`](https://python-all.ru/2.7/library/tarfile.html#tarfile.PAX_FORMAT) входные имена, содержащие символы не из ASCII, должны быть декодированы перед сохранением в виде строк *UTF-8*. Другие форматы не используют *encoding*, если только в качестве входных имён не используются объекты Unicode. Они преобразуются в 8-битные строки символов перед добавлением в архив.511512Аргумент *errors* определяет, как обрабатываются символы, которые невозможно преобразовать в или из кодировки *encoding*. Возможные значения перечислены в разделе [Базовые классы кодеков](https://python-all.ru/2.7/library/codecs.html#codec-base-classes). В режиме чтения существует дополнительная схема `'utf-8'`, означающая, что некорректные символы заменяются их представлением в *UTF-8*. Это схема по умолчанию. В режиме записи значением по умолчанию для *errors* является `'strict'`, чтобы гарантировать, что информация об имени не будет изменена незаметно.513