import bz2 bz2.BZ2Decompressor()
Функция BZ2Decompressor()
модуля bz2
создает новый объект декомпрессора Decompressor
. Этот объект может использоваться для распаковки данных частями.
Для извлечения сжатых данных алгоритмом bz2 за один раз используйте функцию bz2.decompress()
.
bz2.BZ2Decompressor
.Decompressor.decompress(data, max_length=-1)
:Метод Decompressor.decompress()
распаковывает поток данных в виде байтов, возвращая несжатые данные в байтах.
Некоторые данные могут быть буферизованы внутри, для использования в последующих вызовах bz2.decompress()
. Возвращенные данные должны быть объединены с выходными данными любых предыдущих вызовов bz2.decompress()
.
Если аргумент max_length
неотрицательный, то возвращает не более max_length
байтов распакованных данных. Если этот предел достигнут и может быть получен дальнейший вывод, то для атрибута Decompressor.needs_input
будет установлено значение False
. В этом случае следующий вызов Decompressor.decompress()
может предоставить данные как b''
, чтобы получить больше выходных данных.
Если все входные данные были распакованы, но данные продолжают поступать из за того, что передавалось меньше чем max_length
байт или потому что max_length
был отрицательным, то атрибут Decompressor.needs_input
будет иметь значение True
.
Пытаясь распаковать данные после достижения конца потока, метод поднимает исключение EOFError
. Любые данные, обнаруженные после конца потока игнорируется и сохраняется в атрибуте Decompressor.unused_data
`.
Decompressor.eof
:Атрибут Decompressor.eof
возвращает True
, если достигнут маркер конца потока.
Decompressor.unused_data
:Атрибут Decompressor.unused_data
возвращает данные, найденные после окончания сжатого потока. До достижения конца потока возвращаемое значение будет b''
.
Decompressor.needs_input
:Метод Decompressor.needs_input
возвращает False
, если метод Decompressor.decompress()
может предоставить больше распакованных данных, прежде чем потребуется новый несжатый ввод.
bz2
.Распакуем поток сжатых данных, который получим при чтении файла lorem.bz2
, созданного в примере bz2.BZ2Compressor
.
import bz2, os # файл сжатых данных bz2_file = 'lorem.bz2' # файл для распакованных данными txt_file = 'unpack-lorem.txt' # создадим декомпрессор decompressor = bz2.BZ2Decompressor() # открываем файлы на чтение 'lorem.bz2' # и запись 'unpack-lorem.txt' - оба в бинарных # режимах. Распакованные данные `data` # будем частями сразу писать в файл. with open(bz2_file, 'rb') as fpr, open(txt_file, 'wb') as fpw: while True: # читаем по 30 байт block = fpr.read(30) if block: # распаковываем data = decompressor.decompress(block) # пишем fpw.write(data) else: break # смотрим что получилось >>> os.system(f'file {txt_file}') # unpack-lorem.txt: ASCII text, with very long lines