Документация Python неофициальный перевод

tarfile.md

723 строк · 38.3 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.1/library/tarfile.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 12.5. `tarfile` – Чтение и запись tar-архивов89Модуль `tarfile` позволяет читать и записывать tar-архивы, в том числе сжатые с помощью gzip или bz2. (Файлы `.zip` можно читать и записывать с помощью модуля [`zipfile`](https://python-all.ru/3.1/library/zipfile.html#module-zipfile).)1011Некоторые факты и цифры:1213- читает и записывает архивы, сжатые с помощью [`gzip`](https://python-all.ru/3.1/library/gzip.html#module-gzip) и [`bz2`](https://python-all.ru/3.1/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(name=None, mode='r', fileobj=None, bufsize=10240, **kwargs)`2021Возвращает объект [`TarFile`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarFile) для пути *name*. Подробную информацию об объектах [`TarFile`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarFile) и разрешённых именованных аргументах см. в [*TarFile Objects*](https://python-all.ru/3.1/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.1/library/tarfile.html#tarfile.ReadError). Используйте *mode* `'r'`, чтобы избежать этого. Если метод сжатия не поддерживается, возбуждается [`CompressionError`](https://python-all.ru/3.1/library/tarfile.html#tarfile.CompressionError).3738Если указан *fileobj*, он используется вместо [*файлового объекта*](https://python-all.ru/3.1/glossary.html#term-file-object), открытого в бинарном режиме для *имени*. Предполагается, что он находится на позиции 0.3940Для особых случаев существует второй формат для *mode*: `'filemode|[compression]'`. Функция [`tarfile.open()`](https://python-all.ru/3.1/library/tarfile.html#tarfile.open) вернёт объект [`TarFile`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarFile), который обрабатывает свои данные как поток блоков. При этом не выполняется произвольный доступ к файлу. Если задан, *fileobj* может быть любым объектом, имеющим метод `read()` или `write()` (в зависимости от *mode*). *bufsize* задаёт размер блока; по умолчанию `20 * 512` байтов. Используйте этот вариант в сочетании, например, с `sys.stdin`, сокетом [*файловый объект*](https://python-all.ru/3.1/glossary.html#term-file-object) или ленточным устройством. Однако такой объект [`TarFile`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarFile) ограничен: он не допускает произвольного доступа; см. [*Примеры*](https://python-all.ru/3.1/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#### `class tarfile.TarFile`5354Класс для чтения и записи tar-архивов. Не используйте этот класс напрямую, вместо этого используйте5556[`tarfile.open()`](https://python-all.ru/3.1/library/tarfile.html#tarfile.open)5758. См.5960[*TarFile Objects*](https://python-all.ru/3.1/library/tarfile.html#tarfile-objects)6162.6364#### `tarfile.is_tarfile(name)`6566Возвращает6768[`True`](https://python-all.ru/3.1/library/constants.html#True)6970, если7172*name*7374является tar-архивом, который может прочитать модуль7576`tarfile`7778.7980Модуль `tarfile` определяет следующие исключения:8182#### `exception tarfile.TarError`8384Базовый класс для всех исключений8586`tarfile`8788.8990#### `exception tarfile.ReadError`9192Возбуждается, когда открывается tar-архив, который не может быть обработан модулем9394`tarfile`9596или каким-либо образом недействителен.9798#### `exception tarfile.CompressionError`99100Возникает, когда метод сжатия не поддерживается или данные не удаётся корректно декодировать.101102#### `exception tarfile.StreamError`103104Возникает для ограничений, типичных для потокоподобных105106[`TarFile`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarFile)107108объектов.109110#### `exception tarfile.ExtractError`111112Возникает при113114*нефатальных*115116ошибках при использовании117118[`TarFile.extract()`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarFile.extract)119120, но только если121122`TarFile.errorlevel`123124`== 2`125126.127128#### `exception tarfile.HeaderError`129130Возникает при вызове131132[`TarInfo.frombuf()`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarInfo.frombuf)133134, если полученный буфер некорректен.135136Каждая из следующих констант определяет формат tar-архива, который может создать модуль `tarfile`. Подробнее см. раздел [*Поддерживаемые форматы tar*](https://python-all.ru/3.1/library/tarfile.html#tar-formats).137138#### `tarfile.USTAR_FORMAT`139140Формат POSIX.1-1988 (ustar).141142#### `tarfile.GNU_FORMAT`143144Формат GNU tar.145146#### `tarfile.PAX_FORMAT`147148Формат POSIX.1-2001 (pax).149150#### `tarfile.DEFAULT_FORMAT`151152Формат по умолчанию для создания архивов. В настоящее время это153154[`GNU_FORMAT`](https://python-all.ru/3.1/library/tarfile.html#tarfile.GNU_FORMAT)155156.157158На уровне модуля доступны следующие переменные:159160#### `tarfile.ENCODING`161162Кодировка по умолчанию, то есть значение из163164[`sys.getfilesystemencoding()`](https://python-all.ru/3.1/library/sys.html#sys.getfilesystemencoding)165166или167168[`sys.getdefaultencoding()`](https://python-all.ru/3.1/library/sys.html#sys.getdefaultencoding)169170.171172> **См. также**173>174> **Модуль [`zipfile`](https://python-all.ru/3.1/library/zipfile.html#module-zipfile)**175>176> Документация стандартного модуля177>178> [`zipfile`](https://python-all.ru/3.1/library/zipfile.html#module-zipfile)179>180> .181>182> **[Руководство GNU tar, базовый формат tar](https://python-all.ru/3.1/library/tarfile.html)**183>184> Документация для файлов архивов tar, включая расширения GNU tar.185186## 12.5.1. Объекты TarFile187188Объект [`TarFile`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarFile) предоставляет интерфейс к tar-архиву. Tar-архив представляет собой последовательность блоков. Элемент архива (хранящийся файл) состоит из заголовочного блока, за которым следуют блоки данных. Можно хранить файл в tar-архиве несколько раз. Каждый элемент архива представлен объектом [`TarInfo`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarInfo), см. [*TarInfo Objects*](https://python-all.ru/3.1/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.1/library/tarfile.html#tarfile.TarFile) закрывается.203204*format* управляет форматом архива. Он должен быть одной из констант [`USTAR_FORMAT`](https://python-all.ru/3.1/library/tarfile.html#tarfile.USTAR_FORMAT), [`GNU_FORMAT`](https://python-all.ru/3.1/library/tarfile.html#tarfile.GNU_FORMAT) или [`PAX_FORMAT`](https://python-all.ru/3.1/library/tarfile.html#tarfile.PAX_FORMAT), которые определены на уровне модуля.205206Аргумент *tarinfo* можно использовать для замены класса по умолчанию [`TarInfo`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarInfo) на другой.207208Если *dereference* равен [`False`](https://python-all.ru/3.1/library/constants.html#False), символические и жёсткие ссылки добавляются в архив. Если он равен [`True`](https://python-all.ru/3.1/library/constants.html#True), в архив добавляется содержимое целевых файлов. Это не влияет на системы, не поддерживающие символические ссылки.209210Если *ignore\_zeros* равен [`False`](https://python-all.ru/3.1/library/constants.html#False), пустой блок считается концом архива. Если он равен [`True`](https://python-all.ru/3.1/library/constants.html#True), пустые (и недопустимые) блоки пропускаются, и предпринимается попытка получить как можно больше элементов. Это полезно только для чтения объединённых или повреждённых архивов.211212*debug* может быть установлен от `0` (нет отладочных сообщений) до `3` (все отладочные сообщения). Сообщения записываются в `sys.stderr`.213214Если *errorlevel* равен `0`, все ошибки игнорируются при использовании [`TarFile.extract()`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarFile.extract). Тем не менее, они отображаются как сообщения об ошибках в отладочном выводе, если отладка включена. Если `1`, все *фатальные* ошибки возбуждаются как исключения [`OSError`](https://python-all.ru/3.1/library/exceptions.html#OSError) или [`IOError`](https://python-all.ru/3.1/library/exceptions.html#IOError). Если `2`, все *нефатальные* ошибки также возбуждаются как исключения [`TarError`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarError).215216Аргументы *encoding* и *errors* определяют кодировку символов, используемую для чтения или записи архива, и способ обработки ошибок преобразования. Настройки по умолчанию подходят для большинства пользователей. Подробную информацию см. в разделе [*Проблемы Unicode*](https://python-all.ru/3.1/library/tarfile.html#tar-unicode).217218Аргумент *pax\_headers* – это необязательный словарь строк, который будет добавлен в качестве глобального заголовка pax, если *format* равен [`PAX_FORMAT`](https://python-all.ru/3.1/library/tarfile.html#tarfile.PAX_FORMAT).219220#### `TarFile.open(...)`221222Альтернативный конструктор. Функция223224[`tarfile.open()`](https://python-all.ru/3.1/library/tarfile.html#tarfile.open)225226на самом деле является сокращением для этого метода класса.227228#### `TarFile.getmember(name)`229230Возвращает объект [`TarInfo`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarInfo) для элемента *name*. Если *name* не найден в архиве, вызывается исключение [`KeyError`](https://python-all.ru/3.1/library/exceptions.html#KeyError).231232> **Примечание**233>234> Если элемент встречается в архиве более одного раза, последнее его вхождение считается самой актуальной версией.235236#### `TarFile.getmembers()`237238Возвращает элементы архива в виде списка объектов239240[`TarInfo`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarInfo)241242. Список имеет тот же порядок, что и элементы в архиве.243244#### `TarFile.getnames()`245246Возвращает элементы в виде списка их имён. Он имеет тот же порядок, что и список, возвращаемый247248[`getmembers()`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarFile.getmembers)249250.251252#### `TarFile.list(verbose=True)`253254Выводит оглавление в255256`sys.stdout`257258. Если259260*verbose*261262равен263264[`False`](https://python-all.ru/3.1/library/constants.html#False)265266, печатаются только имена элементов. Если он равен267268[`True`](https://python-all.ru/3.1/library/constants.html#True)269270, вывод аналогичен выводу271272**ls -l**273274.275276#### `TarFile.next()`277278Возвращает следующий элемент архива в виде объекта279280[`TarInfo`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarInfo)281282, когда283284[`TarFile`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarFile)285286открыт для чтения. Возвращает287288[`None`](https://python-all.ru/3.1/library/constants.html#None)289290, если больше нет доступных элементов.291292#### `TarFile.extractall(path=".", members=None)`293294Извлекает все элементы из архива в текущий рабочий каталог или каталог *path*. Если задан необязательный *members*, он должен быть подмножеством списка, возвращаемого [`getmembers()`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarFile.getmembers). Информация о каталоге, такая как владелец, время изменения и права доступа, устанавливается после извлечения всех элементов. Это сделано для обхода двух проблем: время изменения каталога сбрасывается каждый раз, когда в нём создаётся файл. И, если права доступа каталога не разрешают запись, извлечение файлов в него завершится ошибкой.295296> **Предупреждение**297>298> Никогда не извлекайте архивы из ненадёжных источников без предварительной проверки. Возможно создание файлов за пределами *path*, например, элементов с абсолютными именами, начинающимися с `"/"`, или с именами, содержащими две точки `".."`.299300#### `TarFile.extract(member, path="")`301302Извлекает элемент архива в текущую рабочую директорию, используя его полное имя. Информация о файле извлекается максимально точно. *member* может быть именем файла или объектом [`TarInfo`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarInfo). Можно указать другую директорию с помощью *path*.303304> **Примечание**305>306> Метод [`extract()`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarFile.extract) не учитывает несколько проблем извлечения. В большинстве случаев следует рассмотреть использование метода [`extractall()`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarFile.extractall).307308> **Предупреждение**309>310> Смотрите предупреждение для [`extractall()`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarFile.extractall).311312#### `TarFile.extractfile(member)`313314Извлекает элемент из архива в виде файлового объекта. *member* может быть именем файла или объектом [`TarInfo`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarInfo). Если *member* – обычный файл, возвращается [*файлоподобный объект*](https://python-all.ru/3.1/glossary.html#term-file-like-object). Если *member* – ссылка, файлоподобный объект создаётся из цели ссылки. Если *member* не является ни тем, ни другим, возвращается [`None`](https://python-all.ru/3.1/library/constants.html#None).315316> **Примечание**317>318> Объект, подобный файлу, доступен только для чтения. Он предоставляет методы `read()`, `readline()`, `readlines()`, `seek()`, `tell()`, и [`close()`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarFile.close), а также поддерживает итерацию по строкам.319320#### `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.1/library/constants.html#False)341342. Если задан343344*exclude*345346, это должна быть функция, принимающая один аргумент – имя файла и возвращающая логическое значение. В зависимости от этого значения соответствующий файл либо исключается (347348[`True`](https://python-all.ru/3.1/library/constants.html#True)349350), либо добавляется (351352[`False`](https://python-all.ru/3.1/library/constants.html#False)353354).355356#### `TarFile.addfile(tarinfo, fileobj=None)`357358Add the [`TarInfo`](https://python-all.ru/3.1/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.1/library/tarfile.html#tarfile.TarInfo) objects using [`gettarinfo()`](https://python-all.ru/3.1/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.gettarinfo(name=None, arcname=None, fileobj=None)`365366Create a367368[`TarInfo`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarInfo)369370object for either the file371372*name*373374or the375376[*file object*](https://python-all.ru/3.1/glossary.html#term-file-object)377378*fileobj*379380(using381382[`os.fstat()`](https://python-all.ru/3.1/library/os.html#os.fstat)383384on its file descriptor). You can modify some of the385386[`TarInfo`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarInfo)387388‘s attributes before you add it using389390[`addfile()`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarFile.addfile)391392. If given,393394*arcname*395396specifies an alternative name for the file in the archive.397398#### `TarFile.close()`399400Close the401402[`TarFile`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarFile)403404. In write mode, two finishing zero blocks are appended to the archive.405406#### `TarFile.pax_headers`407408Словарь, содержащий пары ключ-значение глобальных заголовков pax.409410## 12.5.2. Объекты TarInfo411412A [`TarInfo`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarInfo) object represents one member in a [`TarFile`](https://python-all.ru/3.1/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.413414[`TarInfo`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarInfo) objects are returned by [`TarFile`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarFile)‘s methods `getmember()`, `getmembers()` and `gettarinfo()`.415416#### `class tarfile.TarInfo(name="")`417418Create a419420[`TarInfo`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarInfo)421422object.423424#### `TarInfo.frombuf(buf)`425426Create and return a [`TarInfo`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarInfo) object from string buffer *buf*.427428Вызывает [`HeaderError`](https://python-all.ru/3.1/library/tarfile.html#tarfile.HeaderError), если буфер некорректен..429430#### `TarInfo.fromtarfile(tarfile)`431432Читает следующий элемент из объекта433434[`TarFile`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarFile)435436*tarfile*437438и возвращает его как объект439440[`TarInfo`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarInfo)441442.443444#### `TarInfo.tobuf(format=DEFAULT_FORMAT, encoding=ENCODING, errors='strict')`445446Создаёт строковый буфер из объекта447448[`TarInfo`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarInfo)449450. Информацию об аргументах см. в конструкторе класса451452[`TarFile`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarFile)453454.455456Объект `TarInfo` имеет следующие публичные атрибуты данных:457458#### `TarInfo.name`459460Имя элемента архива.461462#### `TarInfo.size`463464Размер в байтах.465466#### `TarInfo.mtime`467468Время последнего изменения.469470#### `TarInfo.mode`471472Биты разрешений.473474#### `TarInfo.type`475476Тип файла.477478*type*479480обычно является одной из этих констант:481482`REGTYPE`483484,485486`AREGTYPE`487488,489490`LNKTYPE`491492,493494`SYMTYPE`495496,497498`DIRTYPE`499500,501502`FIFOTYPE`503504,505506`CONTTYPE`507508,509510`CHRTYPE`511512,513514`BLKTYPE`515516,517518`GNUTYPE_SPARSE`519520. Для более удобного определения типа объекта521522[`TarInfo`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarInfo)523524используйте методы525526`is_*()`527528ниже.529530#### `TarInfo.linkname`531532Имя целевого файла, которое присутствует только в объектах533534[`TarInfo`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarInfo)535536типа537538`LNKTYPE`539540и541542`SYMTYPE`543544.545546#### `TarInfo.uid`547548Идентификатор пользователя, который изначально сохранил этот элемент.549550#### `TarInfo.gid`551552Идентификатор группы пользователя, который изначально сохранил этот элемент.553554#### `TarInfo.uname`555556Имя пользователя.557558#### `TarInfo.gname`559560Имя группы.561562#### `TarInfo.pax_headers`563564Словарь, содержащий пары ключ-значение связанного расширенного заголовка pax.565566Объект [`TarInfo`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarInfo) также предоставляет несколько удобных методов для запросов:567568#### `TarInfo.isfile()`569570Возвращает571572[`True`](https://python-all.ru/3.1/library/constants.html#True)573574, если объект575576`Tarinfo`577578является обычным файлом.579580#### `TarInfo.isreg()`581582То же, что и583584[`isfile()`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarInfo.isfile)585586.587588#### `TarInfo.isdir()`589590Возвращает591592[`True`](https://python-all.ru/3.1/library/constants.html#True)593594, если это каталог.595596#### `TarInfo.issym()`597598Возвращает599600[`True`](https://python-all.ru/3.1/library/constants.html#True)601602, если это символическая ссылка.603604#### `TarInfo.islnk()`605606Возвращает607608[`True`](https://python-all.ru/3.1/library/constants.html#True)609610, если это жёсткая ссылка.611612#### `TarInfo.ischr()`613614Возвращает615616[`True`](https://python-all.ru/3.1/library/constants.html#True)617618, если это символьное устройство.619620#### `TarInfo.isblk()`621622Возвращает623624[`True`](https://python-all.ru/3.1/library/constants.html#True)625626, если это блочное устройство.627628#### `TarInfo.isfifo()`629630Возвращает631632[`True`](https://python-all.ru/3.1/library/constants.html#True)633634, если это FIFO.635636#### `TarInfo.isdev()`637638Возвращает639640[`True`](https://python-all.ru/3.1/library/constants.html#True)641642, если это символьное устройство, блочное устройство или FIFO.643644## 12.5.3. Примеры645646Как извлечь полный tar-архив в текущий рабочий каталог:647648```python649import tarfile650tar = tarfile.open("sample.tar.gz")651tar.extractall()652tar.close()653```654655Как извлечь подмножество tar-архива с помощью [`TarFile.extractall()`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarFile.extractall), используя функцию-генератор вместо списка:656657```python658import os659import tarfile660661def py_files(members):662    for tarinfo in members:663        if os.path.splitext(tarinfo.name)[1] == ".py":664            yield tarinfo665666tar = tarfile.open("sample.tar.gz")667tar.extractall(members=py_files(tar))668tar.close()669```670671Как создать несжатый tar-архив из списка имён файлов:672673```python674import tarfile675tar = tarfile.open("sample.tar", "w")676for name in ["foo", "bar", "quux"]:677    tar.add(name)678tar.close()679```680681Как прочитать tar-архив, сжатый gzip, и вывести информацию о некоторых элементах:682683```python684import tarfile685tar = tarfile.open("sample.tar.gz", "r:gz")686for tarinfo in tar:687    print(tarinfo.name, "is", tarinfo.size, "bytes in size and is", end="")688    if tarinfo.isreg():689        print("a regular file.")690    elif tarinfo.isdir():691        print("a directory.")692    else:693        print("something else.")694tar.close()695```696697## 12.5.4. Поддерживаемые форматы tar698699Есть три формата tar, которые можно создать с помощью модуля `tarfile`:700701- Формат POSIX.1-1988 ustar ([`USTAR_FORMAT`](https://python-all.ru/3.1/library/tarfile.html#tarfile.USTAR_FORMAT)). Он поддерживает имена файлов длиной до 256 символов и имена ссылок до 100 символов. Максимальный размер файла – 8 гигабайт. Это старый и ограниченный, но широко поддерживаемый формат.702- Формат GNU tar ([`GNU_FORMAT`](https://python-all.ru/3.1/library/tarfile.html#tarfile.GNU_FORMAT)). Он поддерживает длинные имена файлов и имена ссылок, файлы размером более 8 гигабайт и разреженные файлы. Это фактический стандарт в системах GNU/Linux. `tarfile` полностью поддерживает расширения GNU tar для длинных имён, поддержка разреженных файлов доступна только для чтения.703- Формат pax POSIX.1-2001 ([`PAX_FORMAT`](https://python-all.ru/3.1/library/tarfile.html#tarfile.PAX_FORMAT)). Это наиболее гибкий формат, практически без ограничений. Он поддерживает длинные имена файлов и ссылок, большие файлы и хранит пути переносимым образом. Однако не все современные реализации tar умеют корректно обрабатывать архивы pax.704705  Формат *pax* является расширением существующего формата *ustar*. Он использует дополнительные заголовки для информации, которую иначе сохранить невозможно. Существует две разновидности pax-заголовков: расширенные заголовки действуют только на последующий заголовок файла, а глобальные заголовки действительны для всего архива и влияют на все последующие файлы. Все данные в pax-заголовке для портативности кодируются в *UTF-8*.706707Существуют ещё некоторые варианты формата tar, которые можно читать, но не создавать:708709- Древний формат V7. Это первый формат tar из Unix Seventh Edition, хранящий только обычные файлы и каталоги. Имена не должны быть длиннее 100 символов, информация об имени пользователя/группы отсутствует. Некоторые архивы имеют неправильные контрольные суммы заголовков в случае полей с не-ASCII символами.710- Расширенный формат SunOS tar. Этот формат является вариантом формата POSIX.1-2001 pax, но несовместим с ним.711712## 12.5.5. Проблемы Unicode713714Формат tar изначально был задуман для создания резервных копий на ленточных накопителях с основным упором на сохранение информации о файловой системе. Сегодня tar-архивы обычно используются для распространения файлов и обмена архивами по сетям. Одна проблема исходного формата (который является основой всех других форматов) заключается в том, что нет концепции поддержки разных кодировок символов. Например, обычный tar-архив, созданный в системе с *UTF-8*, не может быть корректно прочитан в системе с *Latin-1*, если он содержит символы, отличные от *ASCII*. Текстовые метаданные (например, имена файлов, имена ссылок, имена пользователей/групп) будут повреждены. К сожалению, нет способа автоматически определить кодировку архива. Формат pax был разработан для решения этой проблемы. Он хранит не-ASCII метаданные, используя универсальную кодировку символов *UTF-8*.715716Детали преобразования символов в `tarfile` управляются ключевыми аргументами *encoding* и *errors* класса [`TarFile`](https://python-all.ru/3.1/library/tarfile.html#tarfile.TarFile).717718*encoding* определяет кодировку символов для метаданных в архиве. Значение по умолчанию – [`sys.getfilesystemencoding()`](https://python-all.ru/3.1/library/sys.html#sys.getfilesystemencoding) или `'ascii'` в качестве запасного варианта. В зависимости от того, читается архив или записывается, метаданные должны быть декодированы или закодированы. Если *encoding* задан неподходящим образом, это преобразование может завершиться ошибкой.719720Аргумент *errors* определяет, как обрабатываются символы, которые невозможно преобразовать. Возможные значения перечислены в разделе [*Базовые классы кодеков*](https://python-all.ru/3.1/library/codecs.html#codec-base-classes). В режиме чтения по умолчанию используется схема `'replace'`. Это позволяет избежать неожиданных исключений [`UnicodeError`](https://python-all.ru/3.1/library/exceptions.html#UnicodeError) и гарантирует, что архив всегда может быть прочитан. В режиме записи значение по умолчанию для *errors*`'strict'`. Это гарантирует, что информация об именах не будет изменена незаметно.721722При записи архивов формата [`PAX_FORMAT`](https://python-all.ru/3.1/library/tarfile.html#tarfile.PAX_FORMAT) аргумент *encoding* игнорируется, поскольку не-ASCII метаданные хранятся с использованием *UTF-8*.723