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

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

Сжатие данных частями алгоритмом bz2

Синтаксис:

import bz2

bz2.BZ2Compressor(compresslevel=9)

Параметры:

  • compresslevel=9 - уровень сжатия.

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

Описание:

Функция BZ2Compressor() модуля bz2 создает новый объект компрессора Compressor. Этот объект может использоваться для сжатия данных частями.

Уровень сжатия compresslevel, если он задан, должен быть целым числом от 1 до 9. По умолчанию уровень сжатия 9.

Для сжатия алгоритмом bz2 за один раз используйте функцию bz2.compress().

Методы экземпляра класса bz2.BZ2Compressor.

Compressor.compress(data):

Метод Compressor.compress() принимает данные data для объекта компрессора. Возвращает кусок сжатых данных, если это возможно или в противном случае пустую строку байтов.

Когда данные закончатся, то необходимо вызвать метод Compressor.flush(), чтобы завершить процесс сжатия.

Compressor.flush():

Метод Compressor.flush() завершает процесс сжатия и возвращает сжатые данные, оставленные во внутренних буферах.

Объект компрессора Compressor нельзя использовать после вызова этого метода.


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

import bz2, os

# создадим файл
txt_file = 'lorem.txt'
txt = 'Lorem ipsum. '
with open(txt_file, 'w') as fp:
    for _ in range(10):
        fp.write(txt*50 + '\n\n')

# создадим компрессор
compressor = bz2.BZ2Compressor()
# файл для сжатых данных
bz2_file = 'lorem.bz2'

# откроем файл lorem.txt в бинарном режиме как  
# `rb` и будем читать и сжимать частями.
with open(txt_file, 'rb') as fpr, open(bz2_file, 'wb') as fpw:
    while True:
        # читаем файл частями по 500 байт
        block = fpr.read(500)
        if block:
            data = compressor.compress(block)
            if data:
                fpw.write(data)
        else:
            break
    # данные кончились, запишем остатки
    # данных из буфера в файл 'lorem.bz2'
    fpw.write(compressor.flush())

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

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