import zlib zlib.decompressobj(wbits=MAX_WBITS[, zdict])
wbits=MAX_WBITS
- размер буфера истории,zdict
- предопределенный словарь сжатия.Decompress
.Функция decompressobj()
модуля zlib
возвращает объект распаковки, который будет использоваться для распаковки потоков данных, которые не помещаются в память или поступают постепенно.
Аргумент wbits
управляет размером буфера истории или "размером окна" и ожидаемым форматом заголовка и трейлера. Он имеет то же значение, что и описанный для функции zlib.decompress()
.
Аргумент zdict
указывает предопределенный словарь сжатия. Если zdict
предусмотрен, то это должен быть тот же словарь, который использовался компрессором, создавшим данные, которые должны быть распакованы.
Примечание.
zdict
является изменяемым объектом, например bytearray
, то вы не должны изменять его содержимое между вызовом zlib.decompressobj()
и первым вызовом метода декомпрессора Decompress.decompress()
.Decompress
.Decompress.unused_data
,Decompress.unconsumed_tail
,True
, если достигнут конец сжатых данных Decompress.eof
,Decompress.decompress()
,Decompress.flush()
,Decompress.copy()
,Decompress.unused_data
:Атрибут Decompress.unused_data
представляет собой объект байтов, который содержит любые байты после конца сжатых данных.
Таким образом, возвращаемое остается равным b''
, пока не будет доступен последний байт, который содержит данные сжатия. Если оказалось, что вся строка байтов содержит сжатые данные, то значение останется пустой строкой байтов b''
.
Decompress.unconsumed_tail
:Атрибут Decompress.unconsumed_tail
представляет собой объект байтов, который содержит любые данные, которые не были использованы последним вызовом Decompress.decompress()
, поскольку он превысил предел для буфера несжатых данных.
Эти данные еще не были просмотрены механизмом zlib
, поэтому вы должны передать их возможно, с дополнительными связанными с ними данными обратно к последующему вызову метода Decompress.decompress()
, чтобы получить правильный вывод.
Decompress.eof
:Атрибут Decompress.eof
представляет собой логическое значение, указывающее, достигнут ли конец потока сжатых данных.
Это позволяет различать правильно сформированный сжатый поток, т. е. неполный или усеченный.
Decompress.decompress(data, max_length=0)
:Метод Decompress.decompress()
распаковывает сжатые данные data
, возвращая объект байтов, содержащий несжатые данные, соответствующие по меньшей мере части данных в строке. Эти данные должны быть объединены с выводом, произведенным любыми предыдущими вызовами метода zlib.decompress()
. Некоторые из входных данных могут быть сохранены во внутренних буферах для последующей обработки.
Если необязательный параметр max_length
не равен нулю, то возвращаемое значение будет не длиннее max_length
. Это может означать, что не все сжатые данные могут быть обработаны, а неиспользованные данные будут сохранены в атрибуте Decompress.unconsumed_tail
. Эта строка должна быть передана последующему вызову zlib.decompress()
для продолжения распаковки. Если max_length
равно нулю, то все входные данные распаковываются, а Decompress.unconsumed_tail
пуст.
Decompress.flush([length])
:Метод Decompress.flush()
Весь ожидающий ввод обрабатывается и возвращается объект байтов, содержащий оставшиеся несжатые выходные данные. После вызова этого метода, метод zlib.decompress() не может быть вызван снова. Единственное реалистичное после вызова метода Decompress.flush()
- удалить объект.
Необязательный параметр length
устанавливает начальный размер выходного буфера.
Decompress.copy()
:Метод Decompress.copy()
возвращает копию объекта распаковки. Это можно использовать для сохранения состояния декомпрессора на полпути через поток данных, чтобы ускорить случайный поиск в потоке в будущем.
В этом примере будем распаковывать поток сжатых данных, который будет поступать из файла sample.zl
, созданный в примере для функции zlib.compressobj()
.
import zlib # создадим декомпрессор unpack = zlib.decompressobj() # открываем файлы на чтение 'sample.zl' # и запись 'unpack-sample.txt' - оба в бинарных режимах. with open('sample.zl', 'rb') as fpr, \ open('unpack-sample.txt', 'wb') as fpw: while True: # читаем по 64 байта block = fpr.read(64) if block: # распаковываем данные data = unpack.decompress(block) # записываем данные fpw.write(data) else: break # смотрим что получилось >>> os.system('file unpack-sample.txt') # unpack-sample.txt: UTF-8 Unicode text, with very long lines