tarfile.md
1> **Источник:** https://python-all.ru/3.4/library/tarfile.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 13.6. [`tarfile`](https://python-all.ru/3.4/library/tarfile.html#module-tarfile) – Чтение и запись tar-архивов89**Исходный код:** [Lib/tarfile.py](https://python-all.ru/src/3.4/Lib/tarfile.py)1011---1213Модуль [`tarfile`](https://python-all.ru/3.4/library/tarfile.html#module-tarfile) позволяет читать и записывать tar-архивы, в том числе сжатые с помощью gzip, bz2 и lzma. Для чтения или записи файлов `.zip` используйте модуль [`zipfile`](https://python-all.ru/3.4/library/zipfile.html#module-zipfile), а для более высокоуровневых функций – [*shutil*](https://python-all.ru/3.4/library/shutil.html#archiving-operations).1415Некоторые факты и цифры:1617- читает и записывает архивы, сжатые с помощью [`gzip`](https://python-all.ru/3.4/library/gzip.html#module-gzip), [`bz2`](https://python-all.ru/3.4/library/bz2.html#module-bz2) и [`lzma`](https://python-all.ru/3.4/library/lzma.html#module-lzma), если соответствующие модули доступны.18- поддержка чтения/записи формата POSIX.1-1988 (ustar).19- поддержка чтения/записи формата GNU tar, включая расширения *longname* и *longlink*, поддержка только чтения всех вариантов расширения *sparse*, включая восстановление разрежённых файлов.20- поддержка чтения/записи формата POSIX.1-2001 (pax).21- работает с директориями, обычными файлами, жёсткими ссылками, символическими ссылками, каналами FIFO, символьными и блочными устройствами, а также может получать и восстанавливать информацию о файлах, такую как временная метка, права доступа и владелец.2223Изменено в версии 3.3: Добавлена поддержка сжатия [`lzma`](https://python-all.ru/3.4/library/lzma.html#module-lzma).2425#### `tarfile.open(name=None, mode='r', fileobj=None, bufsize=10240, **kwargs)`2627Возвращает объект [`TarFile`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarFile) для пути *name*. Подробную информацию об объектах [`TarFile`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarFile) и разрешённых именованных аргументах см. в [*TarFile Objects*](https://python-all.ru/3.4/library/tarfile.html#tarfile-objects).2829*mode* должен быть строкой вида `'filemode[:compression]'`; по умолчанию используется `'r'`. Вот полный список комбинаций режимов:3031| Режим | Действие |32| --- | --- |33| `'r' или 'r:*'` | Открыть для чтения с прозрачным сжатием (рекомендуется). |34| `'r:'` | Открыть для чтения исключительно без сжатия. |35| `'r:gz'` | Открыть для чтения со сжатием gzip. |36| `'r:bz2'` | Открыть для чтения со сжатием bzip2. |37| `'r:xz'` | Открыть для чтения со сжатием lzma. |38| `'a' или 'a:'` | Открыть для добавления без сжатия. Файл создаётся, если он не существует. |39| `'w' или 'w:'` | Открывается для записи без сжатия. |40| `'w:gz'` | Открывается для записи со сжатием gzip. |41| `'w:bz2'` | Открывается для записи со сжатием bzip2. |42| `'w:xz'` | Открывается для записи со сжатием lzma. |4344Обратите внимание, что `'a:gz'`, `'a:bz2'` и `'a:xz'` невозможны. Если *mode* не подходит для открытия определённого (сжатого) файла на чтение, возбуждается [`ReadError`](https://python-all.ru/3.4/library/tarfile.html#tarfile.ReadError). Чтобы этого избежать, используйте *mode* `'r'`. Если метод сжатия не поддерживается, возбуждается [`CompressionError`](https://python-all.ru/3.4/library/tarfile.html#tarfile.CompressionError).4546Если указан *fileobj*, он используется вместо [*файлового объекта*](https://python-all.ru/3.4/glossary.html#term-file-object), открытого в бинарном режиме для *имени*. Предполагается, что он находится на позиции 0.4748Для режимов `'w:gz'`, `'r:gz'`, `'w:bz2'`, `'r:bz2'` функция [`tarfile.open()`](https://python-all.ru/3.4/library/tarfile.html#tarfile.open) принимает именованный аргумент *compresslevel* для указания уровня сжатия файла.4950Для особых случаев существует второй формат для *mode*: `'filemode|[compression]'`. Функция [`tarfile.open()`](https://python-all.ru/3.4/library/tarfile.html#tarfile.open) вернёт объект [`TarFile`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarFile), который обрабатывает свои данные как поток блоков. При этом не выполняется произвольный доступ к файлу. Если задан, *fileobj* может быть любым объектом, имеющим метод `read()` или `write()` (в зависимости от *mode*). *bufsize* задаёт размер блока; по умолчанию `20 * 512` байтов. Используйте этот вариант в сочетании, например, с `sys.stdin`, сокетом [*файловый объект*](https://python-all.ru/3.4/glossary.html#term-file-object) или ленточным устройством. Однако такой объект [`TarFile`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarFile) ограничен: он не допускает произвольного доступа; см. [*Примеры*](https://python-all.ru/3.4/library/tarfile.html#tar-examples). Возможные режимы:5152| Режим | Действие |53| --- | --- |54| `'r\|*'` | Открывает *поток данных* tar-блоков для чтения с прозрачным сжатием. |55| `'r\|'` | Открывает *поток данных* несжатых tar-блоков для чтения. |56| `'r\|gz'` | Открывает сжатый gzip *поток данных* для чтения. |57| `'r\|bz2'` | Открывает сжатый bzip2 *поток данных* для чтения. |58| `'r\|xz'` | Открывает сжатый lzma *поток данных* для чтения. |59| `'w\|'` | Открывает несжатый *поток данных* для записи. |60| `'w\|gz'` | Открывает сжатый gzip *поток данных* для записи. |61| `'w\|bz2'` | Открывает сжатый bzip2 *поток данных* для записи. |62| `'w\|xz'` | Открывает сжатый lzma *поток данных* для записи. |6364#### `class tarfile.TarFile`6566Класс для чтения и записи tar-архивов. Не используйте этот класс напрямую, вместо этого используйте [`tarfile.open()`](https://python-all.ru/3.4/library/tarfile.html#tarfile.open). См. [*TarFile Objects*](https://python-all.ru/3.4/library/tarfile.html#tarfile-objects).6768#### `tarfile.is_tarfile(name)`6970Возвращает [`True`](https://python-all.ru/3.4/library/constants.html#True), если *name* является файлом tar-архива, который может прочитать модуль [`tarfile`](https://python-all.ru/3.4/library/tarfile.html#module-tarfile).7172Модуль [`tarfile`](https://python-all.ru/3.4/library/tarfile.html#module-tarfile) определяет следующие исключения:7374#### `exception tarfile.TarError`7576Базовый класс для всех исключений [`tarfile`](https://python-all.ru/3.4/library/tarfile.html#module-tarfile).7778#### `exception tarfile.ReadError`7980Возникает, когда открывается tar-архив, который не может быть обработан модулем [`tarfile`](https://python-all.ru/3.4/library/tarfile.html#module-tarfile) или является некорректным.8182#### `exception tarfile.CompressionError`8384Возникает, когда метод сжатия не поддерживается или данные не удаётся корректно декодировать.8586#### `exception tarfile.StreamError`8788Возникает для ограничений, типичных для потокоподобных [`TarFile`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarFile) объектов.8990#### `exception tarfile.ExtractError`9192Возникает при *нефатальных* ошибках при использовании [`TarFile.extract()`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarFile.extract), но только если `TarFile.errorlevel``== 2`.9394#### `exception tarfile.HeaderError`9596Возникает при вызове [`TarInfo.frombuf()`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarInfo.frombuf), если полученный буфер некорректен.9798На уровне модуля доступны следующие константы:99100#### `tarfile.ENCODING`101102Кодировка по умолчанию: `'utf-8'` в Windows, иначе значение, возвращаемое [`sys.getfilesystemencoding()`](https://python-all.ru/3.4/library/sys.html#sys.getfilesystemencoding).103104Каждая из следующих констант определяет формат tar-архива, который может создать модуль [`tarfile`](https://python-all.ru/3.4/library/tarfile.html#module-tarfile). См. раздел [*Supported tar formats*](https://python-all.ru/3.4/library/tarfile.html#tar-formats) для подробностей.105106#### `tarfile.USTAR_FORMAT`107108Формат POSIX.1-1988 (ustar).109110#### `tarfile.GNU_FORMAT`111112Формат GNU tar.113114#### `tarfile.PAX_FORMAT`115116Формат POSIX.1-2001 (pax).117118#### `tarfile.DEFAULT_FORMAT`119120Формат по умолчанию для создания архивов. В настоящее время это [`GNU_FORMAT`](https://python-all.ru/3.4/library/tarfile.html#tarfile.GNU_FORMAT).121122> **См. также**123>124> **Модуль [`zipfile`](https://python-all.ru/3.4/library/zipfile.html#module-zipfile)**125>126> Документация стандартного модуля127>128> [`zipfile`](https://python-all.ru/3.4/library/zipfile.html#module-zipfile)129>130> .131>132> **[*Операции архивирования*](https://python-all.ru/3.4/library/shutil.html#archiving-operations)**133>134> Документация высокоуровневых средств архивирования, предоставляемых стандартным модулем135>136> [`shutil`](https://python-all.ru/3.4/library/shutil.html#module-shutil)137>138> .139>140> **[Руководство GNU tar, базовый формат tar](https://python-all.ru/3.4/library/tarfile.html)**141>142> Документация для файлов архивов tar, включая расширения GNU tar.143144## 13.6.1. Объекты TarFile145146Объект [`TarFile`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarFile) предоставляет интерфейс к tar-архиву. Tar-архив представляет собой последовательность блоков. Элемент архива (хранящийся файл) состоит из заголовочного блока, за которым следуют блоки данных. Можно хранить файл в tar-архиве несколько раз. Каждый элемент архива представлен объектом [`TarInfo`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarInfo), см. [*TarInfo Objects*](https://python-all.ru/3.4/library/tarfile.html#tarinfo-objects) для подробностей.147148Объект [`TarFile`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarFile) можно использовать как контекстный менеджер в операторе [`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with) . Он будет автоматически закрыт по завершении блока. Обратите внимание, что в случае исключения архив, открытый для записи, не будет финализирован; будет закрыт только внутренний файловый объект. См. раздел [*Examples*](https://python-all.ru/3.4/library/tarfile.html#tar-examples) для примера использования.149150Новое в версии 3.2: Добавлена поддержка протокола менеджера контекста.151152#### `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)`153154Все последующие аргументы необязательны и также могут быть доступны как атрибуты экземпляра.155156*name* – это путь к архиву. Его можно опустить, если указан *fileobj*. В этом случае используется атрибут `name` файлового объекта, если он существует.157158*mode* может быть `'r'` для чтения существующего архива, `'a'` для добавления данных в существующий файл или `'w'` для создания нового файла с перезаписью существующего .159160Если указан *fileobj*, он используется для чтения или записи данных. Если это можно определить, *mode* переопределяется режимом *fileobj*. *fileobj* будет использоваться с позиции 0.161162> **Примечание**163>164> *fileobj* не закрывается, когда [`TarFile`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarFile) закрывается.165166*format* управляет форматом архива. Он должен быть одной из констант [`USTAR_FORMAT`](https://python-all.ru/3.4/library/tarfile.html#tarfile.USTAR_FORMAT), [`GNU_FORMAT`](https://python-all.ru/3.4/library/tarfile.html#tarfile.GNU_FORMAT) или [`PAX_FORMAT`](https://python-all.ru/3.4/library/tarfile.html#tarfile.PAX_FORMAT), которые определены на уровне модуля.167168Аргумент *tarinfo* можно использовать для замены класса по умолчанию [`TarInfo`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarInfo) на другой.169170Если *dereference* равен [`False`](https://python-all.ru/3.4/library/constants.html#False), символические и жёсткие ссылки добавляются в архив. Если он равен [`True`](https://python-all.ru/3.4/library/constants.html#True), в архив добавляется содержимое целевых файлов. Это не влияет на системы, не поддерживающие символические ссылки.171172Если *ignore\_zeros* равен [`False`](https://python-all.ru/3.4/library/constants.html#False), пустой блок считается концом архива. Если он равен [`True`](https://python-all.ru/3.4/library/constants.html#True), пустые (и недопустимые) блоки пропускаются, и предпринимается попытка получить как можно больше элементов. Это полезно только для чтения объединённых или повреждённых архивов.173174*debug* может быть установлен от `0` (нет отладочных сообщений) до `3` (все отладочные сообщения). Сообщения записываются в `sys.stderr`.175176Если *errorlevel* равен `0`, все ошибки игнорируются при использовании [`TarFile.extract()`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarFile.extract). Тем не менее, они отображаются как сообщения об ошибках в отладочном выводе, если отладка включена. Если `1`, все *фатальные* ошибки вызываются как исключения [`OSError`](https://python-all.ru/3.4/library/exceptions.html#OSError). Если `2`, все *нефатальные* ошибки также вызываются как исключения [`TarError`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarError).177178Аргументы *encoding* и *errors* определяют кодировку символов, используемую для чтения или записи архива, и способ обработки ошибок преобразования. Настройки по умолчанию подходят для большинства пользователей. Подробную информацию см. в разделе [*Проблемы Unicode*](https://python-all.ru/3.4/library/tarfile.html#tar-unicode).179180Изменено в версии 3.2: Используется `'surrogateescape'` по умолчанию для аргумента *errors*.181182Аргумент *pax\_headers* – это необязательный словарь строк, который будет добавлен в качестве глобального заголовка pax, если *format* равен [`PAX_FORMAT`](https://python-all.ru/3.4/library/tarfile.html#tarfile.PAX_FORMAT).183184#### `classmethod TarFile.open(...)`185186Альтернативный конструктор. Функция [`tarfile.open()`](https://python-all.ru/3.4/library/tarfile.html#tarfile.open) на самом деле является сокращением для этого метода класса.187188#### `TarFile.getmember(name)`189190Возвращает объект [`TarInfo`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarInfo) для элемента *name*. Если *name* не найден в архиве, вызывается исключение [`KeyError`](https://python-all.ru/3.4/library/exceptions.html#KeyError).191192> **Примечание**193>194> Если элемент встречается в архиве более одного раза, последнее его вхождение считается самой актуальной версией.195196#### `TarFile.getmembers()`197198Возвращает элементы архива в виде списка объектов [`TarInfo`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarInfo). Список имеет тот же порядок, что и элементы в архиве.199200#### `TarFile.getnames()`201202Возвращает элементы в виде списка их имён. Он имеет тот же порядок, что и список, возвращаемый [`getmembers()`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarFile.getmembers).203204#### `TarFile.list(verbose=True)`205206Выводит оглавление в `sys.stdout`. Если *verbose* равен [`False`](https://python-all.ru/3.4/library/constants.html#False), печатаются только имена элементов. Если он равен [`True`](https://python-all.ru/3.4/library/constants.html#True), вывод аналогичен выводу **ls -l**.207208#### `TarFile.next()`209210Возвращает следующий элемент архива в виде объекта [`TarInfo`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarInfo), когда [`TarFile`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarFile) открыт для чтения. Возвращает [`None`](https://python-all.ru/3.4/library/constants.html#None), если больше нет доступных элементов.211212#### `TarFile.extractall(path=".", members=None)`213214Извлекает все элементы из архива в текущий рабочий каталог или каталог *path*. Если задан необязательный *members*, он должен быть подмножеством списка, возвращаемого [`getmembers()`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarFile.getmembers). Информация о каталоге, такая как владелец, время изменения и права доступа, устанавливается после извлечения всех элементов. Это сделано для обхода двух проблем: время изменения каталога сбрасывается каждый раз, когда в нём создаётся файл. И, если права доступа каталога не разрешают запись, извлечение файлов в него завершится ошибкой.215216> **Предупреждение**217>218> Никогда не извлекайте архивы из ненадёжных источников без предварительной проверки. Возможно создание файлов за пределами *path*, например, элементов с абсолютными именами, начинающимися с `"/"`, или с именами, содержащими две точки `".."`.219220#### `TarFile.extract(member, path="", set_attrs=True)`221222Извлекает элемент из архива в текущий рабочий каталог, используя его полное имя. Информация о файле извлекается максимально точно. *member* может быть именем файла или объектом [`TarInfo`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarInfo). Можно указать другой каталог с помощью *path*. Атрибуты файла (владелец, mtime, режим) устанавливаются, если *set\_attrs* не равен false.223224> **Примечание**225>226> Метод [`extract()`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarFile.extract) не учитывает несколько проблем извлечения. В большинстве случаев следует рассмотреть использование метода [`extractall()`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarFile.extractall).227228> **Предупреждение**229>230> Смотрите предупреждение для [`extractall()`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarFile.extractall).231232Изменено в версии 3.2: Добавлен параметр *set\_attrs*.233234#### `TarFile.extractfile(member)`235236Извлекает элемент из архива в виде файлового объекта. *member* может быть именем файла или объектом [`TarInfo`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarInfo). Если *member* является обычным файлом или ссылкой, возвращается объект [`io.BufferedReader`](https://python-all.ru/3.4/library/io.html#io.BufferedReader). В противном случае возвращается [`None`](https://python-all.ru/3.4/library/constants.html#None).237238Изменено в версии 3.3: Возвращается объект [`io.BufferedReader`](https://python-all.ru/3.4/library/io.html#io.BufferedReader).239240#### `TarFile.add(name, arcname=None, recursive=True, exclude=None, *, filter=None)`241242Добавляет файл *name* в архив. *name* может быть файлом любого типа (каталог, fifo, символическая ссылка и т.д.). Если задан, *arcname* указывает альтернативное имя файла в архиве. Каталоги добавляются рекурсивно по умолчанию. Этого можно избежать, установив *recursive* в [`False`](https://python-all.ru/3.4/library/constants.html#False). Если задан *exclude*, он должен быть функцией, принимающей один аргумент – имя файла – и возвращающей логическое значение. В зависимости от этого значения соответствующий файл либо исключается ([`True`](https://python-all.ru/3.4/library/constants.html#True)), либо добавляется ([`False`](https://python-all.ru/3.4/library/constants.html#False)). Если указан *filter*, он должен быть именованным аргументом. Это должна быть функция, принимающая объект [`TarInfo`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarInfo) и возвращающая изменённый объект [`TarInfo`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarInfo). Если вместо этого возвращается [`None`](https://python-all.ru/3.4/library/constants.html#None), объект [`TarInfo`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarInfo) будет исключён из архива. Смотрите [*Примеры*](https://python-all.ru/3.4/library/tarfile.html#tar-examples) для примера.243244Изменено в версии 3.2: Добавлен параметр *filter*.245246Устарело с версии 3.2: Параметр *exclude* устарел; используйте вместо него параметр *filter* вместо него.247248#### `TarFile.addfile(tarinfo, fileobj=None)`249250Add the [`TarInfo`](https://python-all.ru/3.4/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.4/library/tarfile.html#tarfile.TarInfo) objects using [`gettarinfo()`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarFile.gettarinfo).251252> **Примечание**253>254> On Windows platforms, *fileobj* should always be opened with mode `'rb'` to avoid irritation about the file size.255256#### `TarFile.gettarinfo(name=None, arcname=None, fileobj=None)`257258Create a [`TarInfo`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarInfo) object for either the file *name* or the [*file object*](https://python-all.ru/3.4/glossary.html#term-file-object) *fileobj* (using [`os.fstat()`](https://python-all.ru/3.4/library/os.html#os.fstat) on its file descriptor). You can modify some of the [`TarInfo`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarInfo)‘s attributes before you add it using [`addfile()`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarFile.addfile). If given, *arcname* specifies an alternative name for the file in the archive.259260#### `TarFile.close()`261262Close the [`TarFile`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarFile). In write mode, two finishing zero blocks are appended to the archive.263264#### `TarFile.pax_headers`265266Словарь, содержащий пары ключ-значение глобальных заголовков pax.267268## 13.6.2. Объекты TarInfo269270A [`TarInfo`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarInfo) object represents one member in a [`TarFile`](https://python-all.ru/3.4/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.271272[`TarInfo`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarInfo) objects are returned by [`TarFile`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarFile)‘s methods `getmember()`, `getmembers()` and `gettarinfo()`.273274#### `class tarfile.TarInfo(name="")`275276Create a [`TarInfo`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarInfo) object.277278#### `classmethod TarInfo.frombuf(buf, encoding, errors)`279280Create and return a [`TarInfo`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarInfo) object from string buffer *buf*.281282Raises [`HeaderError`](https://python-all.ru/3.4/library/tarfile.html#tarfile.HeaderError) if the buffer is invalid.283284#### `classmethod TarInfo.fromtarfile(tarfile)`285286Читает следующий элемент из объекта [`TarFile`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarFile) *tarfile* и возвращает его как объект [`TarInfo`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarInfo).287288#### `TarInfo.tobuf(format=DEFAULT_FORMAT, encoding=ENCODING, errors='surrogateescape')`289290Создаёт строковый буфер из объекта [`TarInfo`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarInfo). Информацию об аргументах см. в конструкторе класса [`TarFile`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarFile).291292Изменено в версии 3.2: В качестве значения по умолчанию для аргумента *errors* используется `'surrogateescape'`.293294Объект `TarInfo` имеет следующие публичные атрибуты данных:295296#### `TarInfo.name`297298Имя элемента архива.299300#### `TarInfo.size`301302Размер в байтах.303304#### `TarInfo.mtime`305306Время последнего изменения.307308#### `TarInfo.mode`309310Биты разрешений.311312#### `TarInfo.type`313314Тип файла. *type* обычно является одной из следующих констант: `REGTYPE`, `AREGTYPE`, `LNKTYPE`, `SYMTYPE`, `DIRTYPE`, `FIFOTYPE`, `CONTTYPE`, `CHRTYPE`, `BLKTYPE`, `GNUTYPE_SPARSE`. Для более удобного определения типа объекта [`TarInfo`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarInfo) используйте методы `is*()` ниже.315316#### `TarInfo.linkname`317318Имя целевого файла, которое присутствует только в объектах [`TarInfo`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarInfo) типа `LNKTYPE` и `SYMTYPE`.319320#### `TarInfo.uid`321322Идентификатор пользователя, который изначально сохранил этот элемент.323324#### `TarInfo.gid`325326Идентификатор группы пользователя, который изначально сохранил этот элемент.327328#### `TarInfo.uname`329330Имя пользователя.331332#### `TarInfo.gname`333334Имя группы.335336#### `TarInfo.pax_headers`337338Словарь, содержащий пары ключ-значение связанного расширенного заголовка pax.339340Объект [`TarInfo`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarInfo) также предоставляет несколько удобных методов для запросов:341342#### `TarInfo.isfile()`343344Возвращает [`True`](https://python-all.ru/3.4/library/constants.html#True), если объект `Tarinfo` является обычным файлом.345346#### `TarInfo.isreg()`347348То же, что и [`isfile()`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarInfo.isfile).349350#### `TarInfo.isdir()`351352Возвращает [`True`](https://python-all.ru/3.4/library/constants.html#True), если это каталог.353354#### `TarInfo.issym()`355356Возвращает [`True`](https://python-all.ru/3.4/library/constants.html#True), если это символическая ссылка.357358#### `TarInfo.islnk()`359360Возвращает [`True`](https://python-all.ru/3.4/library/constants.html#True), если это жёсткая ссылка.361362#### `TarInfo.ischr()`363364Возвращает [`True`](https://python-all.ru/3.4/library/constants.html#True), если это символьное устройство.365366#### `TarInfo.isblk()`367368Возвращает [`True`](https://python-all.ru/3.4/library/constants.html#True), если это блочное устройство.369370#### `TarInfo.isfifo()`371372Возвращает [`True`](https://python-all.ru/3.4/library/constants.html#True), если это FIFO.373374#### `TarInfo.isdev()`375376Возвращает [`True`](https://python-all.ru/3.4/library/constants.html#True), если это символьное устройство, блочное устройство или FIFO.377378## 13.6.3. Интерфейс командной строки379380Новое в версии 3.4.381382Модуль [`tarfile`](https://python-all.ru/3.4/library/tarfile.html#module-tarfile) предоставляет простой интерфейс командной строки для работы с tar-архивами.383384Чтобы создать новый tar-архив, укажите его имя после опции [*-c*](https://python-all.ru/3.4/using/cmdline.html#cmdoption-c) и затем перечислите имена файлов, которые нужно включить:385386```python387$ python -m tarfile -c monty.tar spam.txt eggs.txt388```389390Можно также передать каталог:391392```python393$ python -m tarfile -c monty.tar life-of-brian_1979/394```395396Чтобы извлечь tar-архив в текущий каталог, используйте опцию [*-e*](https://python-all.ru/3.4/library/tarfile.html#cmdoption-e):397398```python399$ python -m tarfile -e monty.tar400```401402Вы также можете извлечь tar-архив в другой каталог, передав его имя:403404```python405$ python -m tarfile -e monty.tar other-dir/406```407408Для получения списка файлов в tar-архиве используйте опцию [*-l*](https://python-all.ru/3.4/library/tarfile.html#cmdoption-l):409410```python411$ python -m tarfile -l monty.tar412```413414### 13.6.3.1. Опции командной строки415416#### `-l <tarfile>`417418#### `--list <tarfile>`419420Выводит список файлов в tar-архиве.421422#### `-c <tarfile> <source1> <sourceN>`423424#### `--create <tarfile> <source1> <sourceN>`425426Создаёт tar-архив из исходных файлов.427428#### `-e <tarfile> [<output_dir>]`429430#### `--extract <tarfile> [<output_dir>]`431432Извлекает tar-архив в текущий каталог, если *output\_dir* не указан.433434#### `-t <tarfile>`435436#### `--test <tarfile>`437438Проверяет, является ли tar-файл допустимым.439440#### `-v, --verbose`441442Подробный вывод443444## 13.6.4. Примеры445446Как извлечь полный tar-архив в текущий рабочий каталог:447448```python449import tarfile450tar = tarfile.open("sample.tar.gz")451tar.extractall()452tar.close()453```454455Как извлечь подмножество tar-архива с помощью [`TarFile.extractall()`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarFile.extractall), используя функцию-генератор вместо списка:456457```python458import os459import tarfile460461def py_files(members):462 for tarinfo in members:463 if os.path.splitext(tarinfo.name)[1] == ".py":464 yield tarinfo465466tar = tarfile.open("sample.tar.gz")467tar.extractall(members=py_files(tar))468tar.close()469```470471Как создать несжатый tar-архив из списка имён файлов:472473```python474import tarfile475tar = tarfile.open("sample.tar", "w")476for name in ["foo", "bar", "quux"]:477 tar.add(name)478tar.close()479```480481Тот же пример с использованием оператора [`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with):482483```python484import tarfile485with tarfile.open("sample.tar", "w") as tar:486 for name in ["foo", "bar", "quux"]:487 tar.add(name)488```489490Как прочитать tar-архив, сжатый gzip, и вывести информацию о некоторых элементах:491492```python493import tarfile494tar = tarfile.open("sample.tar.gz", "r:gz")495for tarinfo in tar:496 print(tarinfo.name, "is", tarinfo.size, "bytes in size and is", end="")497 if tarinfo.isreg():498 print("a regular file.")499 elif tarinfo.isdir():500 print("a directory.")501 else:502 print("something else.")503tar.close()504```505506Как создать архив и сбросить информацию о пользователе с помощью параметра *filter* в [`TarFile.add()`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarFile.add):507508```python509import tarfile510def reset(tarinfo):511 tarinfo.uid = tarinfo.gid = 0512 tarinfo.uname = tarinfo.gname = "root"513 return tarinfo514tar = tarfile.open("sample.tar.gz", "w:gz")515tar.add("foo", filter=reset)516tar.close()517```518519## 13.6.5. Поддерживаемые форматы tar520521Существует три tar-формата, которые можно создать с помощью модуля [`tarfile`](https://python-all.ru/3.4/library/tarfile.html#module-tarfile):522523- Формат ustar POSIX.1-1988 ([`USTAR_FORMAT`](https://python-all.ru/3.4/library/tarfile.html#tarfile.USTAR_FORMAT)). Он поддерживает имена файлов длиной до 256 символов и имена ссылок до 100 символов. Максимальный размер файла – 8 Гиб. Это старый и ограниченный, но широко поддерживаемый формат.524- Формат GNU tar ([`GNU_FORMAT`](https://python-all.ru/3.4/library/tarfile.html#tarfile.GNU_FORMAT)). Он поддерживает длинные имена файлов и ссылок, файлы размером более 8 Гиб и разрежённые файлы. Это де-факто стандарт в системах GNU/Linux. [`tarfile`](https://python-all.ru/3.4/library/tarfile.html#module-tarfile) полностью поддерживает расширения GNU tar для длинных имён, поддержка разрежённых файлов – только для чтения.525- Формат pax POSIX.1-2001 ([`PAX_FORMAT`](https://python-all.ru/3.4/library/tarfile.html#tarfile.PAX_FORMAT)). Это наиболее гибкий формат, практически без ограничений. Он поддерживает длинные имена файлов и ссылок, большие файлы и хранит пути переносимым образом. Однако не все современные реализации tar умеют корректно обрабатывать архивы pax.526527 Формат *pax* является расширением существующего формата *ustar*. Он использует дополнительные заголовки для информации, которую иначе сохранить невозможно. Существует две разновидности pax-заголовков: расширенные заголовки действуют только на последующий заголовок файла, а глобальные заголовки действительны для всего архива и влияют на все последующие файлы. Все данные в pax-заголовке для портативности кодируются в *UTF-8*.528529Существуют ещё некоторые варианты формата tar, которые можно читать, но не создавать:530531- Древний формат V7. Это первый формат tar из Unix Seventh Edition, хранящий только обычные файлы и каталоги. Имена не должны быть длиннее 100 символов, информация об имени пользователя/группы отсутствует. Некоторые архивы имеют неправильные контрольные суммы заголовков в случае полей с не-ASCII символами.532- Расширенный формат SunOS tar. Этот формат является вариантом формата POSIX.1-2001 pax, но несовместим с ним.533534## 13.6.6. Вопросы Unicode535536Формат tar изначально был задуман для создания резервных копий на ленточных накопителях с основным упором на сохранение информации о файловой системе. Сегодня tar-архивы обычно используются для распространения файлов и обмена архивами по сетям. Одна проблема исходного формата (который является основой всех других форматов) заключается в том, что нет концепции поддержки разных кодировок символов. Например, обычный tar-архив, созданный в системе с *UTF-8*, не может быть корректно прочитан в системе с *Latin-1*, если он содержит символы, отличные от *ASCII*. Текстовые метаданные (например, имена файлов, имена ссылок, имена пользователей/групп) будут повреждены. К сожалению, нет способа автоматически определить кодировку архива. Формат pax был разработан для решения этой проблемы. Он хранит не-ASCII метаданные, используя универсальную кодировку символов *UTF-8*.537538Детали преобразования символов в [`tarfile`](https://python-all.ru/3.4/library/tarfile.html#module-tarfile) управляются именованными аргументами *encoding* и *errors* класса [`TarFile`](https://python-all.ru/3.4/library/tarfile.html#tarfile.TarFile).539540*encoding* определяет кодировку символов для метаданных в архиве. Значение по умолчанию – [`sys.getfilesystemencoding()`](https://python-all.ru/3.4/library/sys.html#sys.getfilesystemencoding) или `'ascii'` в качестве запасного варианта. В зависимости от того, читается архив или записывается, метаданные должны быть декодированы или закодированы. Если *encoding* задан неподходящим образом, это преобразование может завершиться ошибкой.541542Аргумент *errors* определяет, как обрабатывать символы, которые невозможно преобразовать. Возможные значения перечислены в разделе [*Обработчики ошибок*](https://python-all.ru/3.4/library/codecs.html#error-handlers). По умолчанию используется схема `'surrogateescape'`, которую Python также применяет для системных вызовов файловой системы; см. [*Имена файлов, аргументы командной строки и переменные окружения*](https://python-all.ru/3.4/library/os.html#os-filenames).543544В случае архивов [`PAX_FORMAT`](https://python-all.ru/3.4/library/tarfile.html#tarfile.PAX_FORMAT) *encoding* обычно не требуется, поскольку все метаданные хранятся в *UTF-8*. *encoding* используется только в редких случаях, когда декодируются двоичные заголовки pax или сохраняются строки с суррогатными символами.545