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

Класс BZ2File() модуля bz2 в Python

Открыть bzip2-сжатый в двоичном режиме для чтения/записи

Синтаксис:

import bz2

fbz = bz2.BZ2File(filename, mode='r', buffering=None, 
                  compresslevel=9)

Параметры:

  • filename - имя файла,
  • mode='r' - режим чтения/записи,
  • buffering=None - буферизация,
  • compresslevel=9 - int, режим сжатия.

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

Описание:

Класс BZ2File() модуля bz2 открывает bzip2-сжатый файл в двоичном режиме для чтения или записи.

Если аргумент filename является str или bytes объектом, то этот файл открывается напрямую. В противном случае это должен быть файловый объект, который будет использоваться для чтения или записи сжатых данных.

Аргумент mode может быть:

  • 'r' для чтения (по умолчанию),
  • 'w' для перезаписи,
  • 'x' для эксклюзивного создания,
  • 'a' для добавления данных.

Они могут быть эквивалентно заданы как 'rb', 'wb', 'xb' и 'ab' соответственно.

Если аргумент filename является файловым объектом, а не фактическим именем файла, то режим 'w' не удаляет данные из файла, а эквивалентен 'a'.

Если аргумент mode равен 'w' или 'a', то уровень сжатия compresslevel может быть целым числом от 1 до 9, указывающим уровень сжатия: 1 производит наименьшее сжатие, а 9 (по умолчанию) производит наибольшее сжатие.

Если аргумент mode равен 'r', то входной файл может быть объединением нескольких сжатых потоков.

Экземпляр bz2.BZ2File() предоставляет все методы, указанные в io.BufferedIOBase за исключением методов detach() и truncate(). Итерация и оператор with поддерживаются.

Аргумент buffering устарел с версии Python-3.0 и игнорируется.

Метод объекта BZ2File.

fbz.peek([n]):

Метод fbz.peek([n]) возвращает буферизированные данные без изменения позиции в файле. По крайней мере один байт данных будет возвращен, если это не конец файла EOF. Точное количество возвращаемых байтов не указано.

Обратите внимание, хотя вызов fbz.peek() не меняет файловую позицию в объекте BZ2File, он может изменить позицию базового файлового объекта, например если в конструктор класса bz2.BZ2File() аргументу filename передан файловый объект.

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

Создадим массив данных и заархивируем его в файл.

import bz2, os

# создаем массив данных
text = 'Привет Мир. '
tmp = []
for _ in range(50):
    tmp.append(text*50 + '\n')

# файл для записи текста
txt_file = 'test.txt'
# пишем текст в файл
with open(txt_file, 'w') as fp:
    fp.write('\n\n'.join(tmp))

# файл для архива.
bzip2_file = 'test.bzip2'

# Открываем оба файла в бинарном режиме
# на чтение текстовый файл функцией open() и
# на запись файл `test.bzip2` при помощи bz2.BZ2File
# далее из текстового файла читаем в `test.bzip2` пишем
with open(txt_file, 'rb') as fp, bz2.BZ2File(bzip2_file, 'wb', compresslevel=9) as bz:
    data = fp.read()
    bz.write(data)

# смотрим что получилось
>>> os.system(f'file {bzip2_file}')
# test.bzip2: bzip2 compressed data, block size = 900k

# смотрим объем файлов в байтах
>>> os.path.getsize(txt_file)
# 52648
>>> os.path.getsize(bzip2_file)
# 96

Для того, что бы собрать .bzip2 архив из нескольких файлов стоит посмотреть в сторону модуля tarfile.

Теперь распакуем полученный bzip2 файл.

import bz2, os

txt_file = 'unpack-test.txt'
bzip2_file = 'test.bzip2'

# Открываем оба файла в бинарном режиме
# и делаем все наоборот, из сжатого файла читаем
# в текстовый файл пишем. ВСЕ!
with open(txt_file, 'wb') as fpw, bz2.BZ2File(bzip2_file, 'rb') as bzr:
    data = bzr.read()
    fpw.write(data)

# смотрим что получилось
>>> os.system(f'file {txt_file}')
# unpack-test.txt: UTF-8 Unicode text, with very long lines