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

Функция decompressobj() модуля zlib в Python

Распаковка потоков данных, сжатых zlib

Синтаксис:

import zlib

zlib.decompressobj(wbits=MAX_WBITS[, zdict])

Параметры:

  • wbits=MAX_WBITS - размер буфера истории,
  • zdict - предопределенный словарь сжатия.

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

Описание:

Функция decompressobj() модуля zlib возвращает объект распаковки, который будет использоваться для распаковки потоков данных, которые не помещаются в память или поступают постепенно.

Аргумент wbits управляет размером буфера истории или "размером окна" и ожидаемым форматом заголовка и трейлера. Он имеет то же значение, что и описанный для функции zlib.decompress().

Аргумент zdict указывает предопределенный словарь сжатия. Если zdict предусмотрен, то это должен быть тот же словарь, который использовался компрессором, создавшим данные, которые должны быть распакованы.

Примечание.

  • Если zdict является изменяемым объектом, например bytearray, то вы не должны изменять его содержимое между вызовом zlib.decompressobj() и первым вызовом метода декомпрессора Decompress.decompress().

Атрибуты и методы объекта декомпрессии Decompress.


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