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

Функции compress() и decompress() модуля bz2 в Python

Сжатие/распаковка данных по алгоритму bz2 за один раз

Синтаксис:

import bz2

bz2.compress(data, compresslevel=9)
bz2.decompress(data)

Параметры:

  • data - данные в виде байтов,
  • compresslevel=9 - уровень сжатия.

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

Описание:

Функция bz2.compress() производит сжатие данных data, представленных в виде строки байтов.

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

Функция bz2.compress() производит распаковку данных data, представленных в виде строки байтов.

Если данные data являются объединением нескольких сжатых потоков, то функция bz2.compress() распакует все потоки.

  • Для инкрементального сжатия используйте bz2.BZ2Compressor().
  • Для инкрементальной распаковки используйте bz2.BZ2Decompressor().

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

Сжатие данных за один раз.

>>> import bz2, os
>>> text = 'bz2.compress() производит сжатие данных' * 3
>>> data = text.encode('utf-8')
>>> compress = bz2.compress(data)
# длина текста
>>> len(text)
# 117

# длина сжатых данных
>>> len(compress)
# 104

# Степень сжатия данных
>>> (1 - len(compress) / len(text)) * 100
# 11.111111111111116

# кстати сжатые данные можно сохранить в файл '.bz2'
# только файл нужно открывать в бинарном режиме
with open('temp.bz2', 'wb') as fp:
    fp.write(compress)

# проверяем
>>> os.system('file temp.bz2')
# temp.bz2: bzip2 compressed data, block size = 900k

Для короткого текста, коэффициент сжатая может быть больше 1.

Теперь распакуем данные, упакованные выше.

>>> import bz2
# распаковываем данные
>>> unpack = bz2.decompress(compress)
# декодируем байты в текст
>>> unpack_text = unpack.decode('utf-8')
# сравним данные с исходным текстом
>>> unpack_text == text
# True

# извлечем сжатые данные из файла '.bz2'
>>> with open('temp.bz2', 'rb') as fp:
...     compress = fp.read()

>>> data = bz2.decompress(compress)
>>> text = data.decode('utf-8')
# выведем на печать 20 первых символов
>>> print(text[:20])
# Функция `bz2.compre

Для работы с файлами архивами .bz2 напрямую есть функции bz2.BZ2File() - для работы с бинарными данными и bz2.open() для работы с бинарными и текстовыми данными.

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

При увеличении объема данных степень сжатия становиться лучше.

import bz2

text = 'Привет docs-python.ru' * 5

for i in range(1, 9):
    text = text * i
    data = text.encode('utf-8')
    compress = bz2.compress(data)
    txt = len(text)
    pack = len(compress)
    proc = round((1 - pack/txt) * 100, 3)
    print(f'{txt} \t\t {pack} \t\t {proc}%')

# 75               80              106.667%
# 150              83              44.667%
# 450              85              81.111%
# 1800             93              94.833%
# 9000             100             98.889%
# 54000            108             99.8%
# 378000           119             99.969%
# 3024000          565             99.981%