Сообщить об ошибке.

Функция open() модуля tarfile в Python

Открыть tar.gz, tar.bz2 или tar.xz для извлечения/сжатия/добавления файлов

Синтаксис:

import tarfile

tar = tarfile.open(name=None, mode='r', fileobj=None, \
                   bufsize=10240, **kwargs)

Параметры:

Возвращаемое значение:

Описание:

Функция open() модуля tarfile открывает tar, tar.gz, tar.bz2 или tar.xz архивы, указанные в name в режиме mode и возвращает объект объект TarFile.

Для получения подробной информации об допустимых ключевых аргументах **kwargs смотрите класс tarfile.TarFile.

Аргумент mode должен быть строкой вида 'filemode[:compression]', по умолчанию он равен 'r'.

Полный список комбинаций режимов:

modeДействие
'r', 'r:*'Открыть для чтения с прозрачным сжатием (рекомендуется).
'r:'Открыто для чтения исключительно без сжатия.
'r:gz'Открыть для чтения с помощью сжатия gzip.
'r:bz2'Открыть для чтения с помощью сжатия bzip2.
'r:xz'Открыть для чтения с помощью сжатия lzma.
'x', 'x:'Создать tar-файл исключительно без сжатия. Вызывает исключение `FileExistsError`, если он уже существует.
'x:gz'Создать .tar.gz со сжатием gzip. Вызывает исключение `FileExistsError`, если он уже существует.
'x:bz2'Создать .tar.bz2 со сжатием bzip2. Вызывает исключение `FileExistsError`, если он уже существует.
'x:xz'Создать .tar.xz со сжатием lzma. Вызывает исключение `FileExistsError`, если он уже существует.
'a', 'a:'Открывает tar-файл для добавления без сжатия. Файл создается, если он не существует.
'w', 'w:'Открывает tar-файл для добавления файлов без сжатия.
'w:gz'Открывает .tar.gz для добавления файлов с сжатием gzip.
'w:bz2'Открывает .tar.bz2 для добавления файлов с сжатием bzip2.
'w:xz'Открывает .tar.xz для добавления файлов с сжатием lzma.

Обратите внимание, что режимы a:gz, a:bz2 или a:xz невозможны. Если режим не подходит для открытия определенного (сжатого) файла для чтения, то возникает ошибка ReadError. Чтобы избежать этого, используйте режим 'r'. Если метод сжатия не поддерживается, возникает исключение CompressionError.

Если указан аргумент fileobj, он используется как альтернатива объекту файла, открытому в двоичном режиме для имени name. Курсор в файловом объекте должен быть в позиции 0.

Для режимов 'w:gz', 'r:gz', 'w:bz2', 'r:bz2', 'x:gz', 'x:bz2', функция tarfile.open() принимает ключевой аргумент compresslevel (по умолчанию 9), указывающий уровень сжатия файла.

Для специальных целей существует второй формат для mode: 'filemode|[compression]'. Функция tarfile.open() вернет объект TarFile, который обрабатывает его данные в виде потока блоков. Случайный поиск по файлу не производится. Если задан fileobj, то он может быть любым объектом, который имеет метод .read() или .write(), в зависимости от режима. Аргумент bufsize определяет размер блока и по умолчанию составляет 20 * 512 байт. Используйте этот вариант в сочетании, например с sys.stdin объектом файла сокета или ленточного устройства. Однако такой объект TarFile ограничен тем, что он не допускает произвольный доступ, см. Примеры.

Возможные специальные режимы:

modeДействие
'r|*'Открывает поток блоков tar для чтения с прозрачным сжатием.
'r|'Открывает поток несжатых блоков tar для чтения.
'r|gz'Открывает сжатый поток gzip для чтения.
'r|bz2'Открывает сжатый поток bzip2 для чтения.
'r|xz'Открывает сжатый поток lzma для чтения.
'w|'Открывает несжатый поток для записи.
'w|gz'Открывает сжатый поток gzip для записи.
'w|bz2'Открывает сжатый поток bzip2 для записи.
'w|xz'Открывает сжатый поток lzma для записи.

Изменено в Python 3.12: ключевой аргумент compresslevel также работает для потоков.

Примеры использования:

Создадим tar.gz архив. В отличие от модуля zipfile, где надо читать каталог самому и добавлять файлы в архив по одному, в модуле tarfile файлы в каталогах читаются и добавляются рекурсивно по умолчанию.

import tarfile, os

path = '/home/docs-python/script/sql-script/'

with tarfile.open("sample.tar.gz", "w:gz") as tar:
    tar.add(path, 'sql-script')

# проверим
>>> os.system('file sample.tar.gz')
# sample.tar.gz: gzip compressed data, was "sample.tar", 
# last modified: Tue May 19 07:52:41 2020, max compression

Добавить файл в сжатый, уже существующий архив используя только модуль tarfile не получится. Для этого необходимо распаковать контейнер tar, используя в зависимости от сжатия модуль gzip, bz2 или lzma. В полученный контейнер tar добавить файлы при помощи модуля tarfile используя mode='a', а затем снова сжать, используя соответствующий модуль.

import tarfile, gzip

# распаковываем контейнер с файлами 'sample.tar' 
with gzip.open('sample.tar.gz', 'rb') as rgz:
    tar = rgz.read()
    with open('sample.tar', 'wb') as fp:
        fp.write(tar)

# добавляем файл 'test.py' в 'sample.tar'
with tarfile.open('sample.tar', 'a') as addtar:
    addtar.add('test.py')

# сжимаем контейнер с файлами 'sample.tar'
with open('sample.tar', 'rb') as fp:
    data = fp.read()
    with gzip.open('sample.tar.gz', 'wb') as wgz:
        wgz.write(data)

# смотрим что получилось
with tarfile.open('sample.tar.gz', 'r') as tar:
    info = tar.getmembers()
    for file_info in info:
        print(file_info.name)

# sql-script
# sql-script/Script-5.sql
# sql-script/Script-1.sql
# sql-script/Script-3.sql
# sql-script/procedure.sql
# sql-script/Script-2.sql
# sql-script/Script-4.sql
# test.py

Извлечем файлы в рабочую директорию, в каталог extract_tar. Если такого каталога нет, то он создастся.

import tarfile, glob, os

path = 'extract_tar'

with tarfile.open('sample.tar.gz', 'r') as tar:
    tar.extractall(path)

# смотрим файлы в каталоге 'extract_tar'
path = os.path.join(path, '**')
for file in glob.glob(path, recursive=True):
    print(file)

# extract_tar/
# extract_tar/sql-script
# extract_tar/sql-script/Script-5.sql
# extract_tar/sql-script/Script-1.sql
# extract_tar/sql-script/Script-3.sql
# extract_tar/sql-script/procedure.sql
# extract_tar/sql-script/Script-2.sql
# extract_tar/sql-script/Script-4.sql
# extract_tar/test.py