import bz2 bz2.compress(data, compresslevel=9) bz2.decompress(data)
data
- данные в виде байтов,compresslevel=9
- уровень сжатия.bz2.compress
- сжатые данные в виде строки байтов,bz2.decompress
- распакованные данные в виде строки байтов.Функция 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%