import tarfile tar = tarfile.open(name=None, mode='r', fileobj=None, \ bufsize=10240, **kwargs)
name=None
- путь к tar.*
архива,mode='r'
- режим открытия tar.*
архива,fileobj=None
- альтернатива объекту файла,bufsize=10240
- размер блока чтения/записи для специального режима, **kwargs
- ключевые аргументы класса tarfile.TarFile
.Функция 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