> **Источник:** https://python-all.ru/3.4/library/zlib.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# 13.1. [`zlib`](https://python-all.ru/3.4/library/zlib.html#module-zlib) – сжатие, совместимое с **gzip**

Для приложений, которым требуется сжатие данных, функции этого модуля позволяют выполнять сжатие и распаковку с помощью библиотеки zlib. Библиотека zlib имеет собственную домашнюю страницу по адресу [http://www.zlib.net](https://python-all.ru/3.4/library/zlib.html). Существуют известные несовместимости между модулем Python и версиями библиотеки zlib старше 1.1.3; в версии 1.1.3 есть уязвимость безопасности, поэтому рекомендуется использовать версию 1.1.4 или новее.

Функции zlib имеют множество опций и зачастую должны вызываться в определённом порядке. Данная документация не пытается охватить все комбинации; за авторитетной информацией обращайтесь к руководству zlib по адресу [http://www.zlib.net/manual.html](https://python-all.ru/3.4/library/zlib.html).

Для чтения и записи файлов `.gz` обратитесь к модулю [`gzip`](https://python-all.ru/3.4/library/gzip.html#module-gzip).

Доступные исключение и функции в этом модуле:

#### `exception zlib.error`

Исключение, возникающее при ошибках сжатия и распаковки.

#### `zlib.adler32(data[, value])`

Вычисляет контрольную сумму Adler-32 для *data*. (Контрольная сумма Adler-32 почти так же надёжна, как CRC32, но вычисляется гораздо быстрее.) Если указан *value*, он используется как начальное значение контрольной суммы; в противном случае используется фиксированное значение по умолчанию. Это позволяет вычислять контрольную сумму на лету для объединения нескольких входных данных. Алгоритм не является криптостойким и не должен использоваться для аутентификации или цифровых подписей. Поскольку алгоритм спроектирован как алгоритм контрольной суммы, он не подходит для использования в качестве универсальной хеш-функции.

Всегда возвращает беззнаковое 32-битное целое число.

> **Примечание**
>
> Чтобы получать одинаковое числовое значение во всех версиях Python и на всех платформах, используйте adler32(data) & 0xffffffff. Если вы используете контрольную сумму только в упакованном двоичном формате, это необязательно, поскольку возвращаемое значение является правильным 32-битным двоичным представлением независимо от знака.

#### `zlib.compress(data[, level])`

Сжимает байты *data* и возвращает объект bytes, содержащий сжатые данные. *level* – целое число от `0` до `9`, управляющее степенью сжатия; `1` – самый быстрый и даёт наименьшее сжатие, `9` – самый медленный и даёт наибольшее. `0` – без сжатия. Значение по умолчанию – `6`. При возникновении ошибки возбуждается исключение [`error`](https://python-all.ru/3.4/library/zlib.html#zlib.error).

#### `zlib.compressobj(level=-1, method=DEFLATED, wbits=15, memLevel=8, strategy=Z_DEFAULT_STRATEGY[, zdict])`

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

*level* – степень сжатия: целое число от `0` до `9`. Значение `1` – самое быстрое и даёт наименьшее сжатие, значение `9` – самое медленное и даёт наибольшее. `0` – без сжатия. Значение по умолчанию – `6`.

*method* – алгоритм сжатия. В настоящее время поддерживается только значение `DEFLATED`.

*wbits* – двоичный логарифм размера буфера окна. Это целое число от `8` до `15`. Большие значения обеспечивают лучшее сжатие, но требуют больше памяти.

Аргумент *memLevel* управляет объёмом памяти, используемой для внутреннего состояния сжатия. Допустимые значения – от `1` до `9`. Большие значения используют больше памяти, но работают быстрее и дают меньший выходной поток.

*strategy* используется для настройки алгоритма сжатия. Возможные значения: `Z_DEFAULT_STRATEGY`, `Z_FILTERED` и `Z_HUFFMAN_ONLY`.

*zdict* – предопределённый словарь сжатия. Это последовательность байтов (например, объект [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes)), содержащая подпоследовательности, которые, как ожидается, будут часто встречаться в сжимаемых данных. Те подпоследовательности, которые, вероятно, будут самыми распространёнными, должны находиться в конце словаря.

Изменено в версии 3.3: Добавлен параметр *zdict* и поддержка именованных аргументов.

#### `zlib.crc32(data[, value])`

Вычисляет контрольную сумму CRC (Cyclic Redundancy Check) для *data*. Если указан *value*, он используется как начальное значение контрольной суммы; в противном случае используется фиксированное значение по умолчанию. Это позволяет вычислять контрольную сумму на лету для объединения нескольких входных данных. Алгоритм не является криптостойким и не должен использоваться для аутентификации или цифровых подписей. Поскольку алгоритм спроектирован как алгоритм контрольной суммы, он не подходит для использования в качестве универсальной хеш-функции.

Всегда возвращает беззнаковое 32-битное целое число.

> **Примечание**
>
> Чтобы получать одинаковое числовое значение во всех версиях Python и на всех платформах, используйте `crc32(data) & 0xffffffff`. Если вы используете контрольную сумму только в упакованном двоичном формате, это необязательно, поскольку возвращаемое значение является правильным 32-битным двоичным представлением независимо от знака.

#### `zlib.decompress(data[, wbits[, bufsize]])`

Распаковывает байты *data* и возвращает объект bytes, содержащий несжатые данные. Параметр *wbits* управляет размером буфера окна и подробно описан ниже. Если указан *bufsize*, он используется как начальный размер выходного буфера. При возникновении ошибки возбуждается исключение [`error`](https://python-all.ru/3.4/library/zlib.html#zlib.error).

Абсолютное значение *wbits* – это двоичный логарифм размера буфера истории («размер окна»), используемого при сжатии данных. Для последних версий библиотеки zlib его абсолютное значение должно быть от 8 до 15: большие значения дают лучшее сжатие ценой большего расхода памяти. При распаковке потока *wbits* не должен быть меньше размера, использованного при сжатии; слишком маленькое значение приведёт к исключению. Поэтому значение по умолчанию – максимальное, 15. Когда *wbits* отрицательно, стандартный заголовок **gzip** подавляется.

*bufsize* – начальный размер буфера для хранения распакованных данных. Если требуется больше места, размер буфера будет увеличен по мере необходимости, так что не обязательно подбирать это значение точно; его настройка лишь сэкономит несколько вызовов `malloc()`. Размер по умолчанию – 16384.

#### `zlib.decompressobj(wbits=15[, zdict])`

Возвращает объект распаковки, предназначенный для распаковки потоков данных, которые не помещаются в память целиком.

Параметр *wbits* управляет размером буфера окна.

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

> **Примечание**
>
> Если *zdict* является изменяемым объектом (например, [`bytearray`](https://python-all.ru/3.4/library/functions.html#bytearray)), его содержимое нельзя изменять между вызовом [`decompressobj()`](https://python-all.ru/3.4/library/zlib.html#zlib.decompressobj) и первым вызовом метода `decompress()` распаковщика.

Изменено в версии 3.3: Добавлен параметр *zdict*.

Объекты сжатия поддерживают следующие методы:

#### `Compress.compress(data)`

Сжимает *data* и возвращает объект bytes, содержащий сжатые данные для как минимум части данных из *data*. Эти данные следует добавить к результату, полученному от предыдущих вызовов метода [`compress()`](https://python-all.ru/3.4/library/zlib.html#zlib.compress). Некоторые входные данные могут сохраняться во внутренних буферах для последующей обработки.

#### `Compress.flush([mode])`

Обрабатываются все ожидающие входные данные и возвращается объект bytes, содержащий оставшийся сжатый вывод. *mode* можно выбрать из констант `Z_SYNC_FLUSH`, `Z_FULL_FLUSH` или `Z_FINISH`, по умолчанию `Z_FINISH`. `Z_SYNC_FLUSH` и `Z_FULL_FLUSH` позволяют продолжать сжатие новых строк байтов, тогда как `Z_FINISH` завершает сжатый поток и предотвращает дальнейшее сжатие. После вызова [`flush()`](https://python-all.ru/3.4/library/zlib.html#zlib.Compress.flush) с *mode*, установленным в `Z_FINISH`, метод [`compress()`](https://python-all.ru/3.4/library/zlib.html#zlib.compress) больше нельзя вызывать; единственное разумное действие – удалить объект.

#### `Compress.copy()`

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

Объекты распаковки поддерживают следующие методы и атрибуты:

#### `Decompress.unused_data`

Объект bytes, содержащий все байты, которые идут после конца сжатых данных. То есть он остаётся `b""` до тех пор, пока не станет доступен последний байт, содержащий данные сжатия. Если вся строка байтов оказалась содержащей сжатые данные, это будет `b""`, пустой объект bytes.

#### `Decompress.unconsumed_tail`

Объект bytes, содержащий любые данные, которые не были обработаны последним вызовом [`decompress()`](https://python-all.ru/3.4/library/zlib.html#zlib.decompress), поскольку они превысили лимит буфера несжатых данных. Эти данные ещё не были обработаны механизмом zlib, поэтому их необходимо передать (возможно, с присоединёнными дополнительными данными) обратно в последующий вызов метода [`decompress()`](https://python-all.ru/3.4/library/zlib.html#zlib.decompress), чтобы получить корректный вывод.

#### `Decompress.eof`

Логическое значение, указывающее, достигнут ли конец сжатого потока данных.

Это позволяет различать правильно сформированный сжатый поток и неполный или усечённый.

Новое в версии 3.3.

#### `Decompress.decompress(data[, max_length])`

Распаковывает *data*, возвращая объект bytes, содержащий несжатые данные, соответствующие по меньшей мере части данных из *string*. Эти данные следует добавить к выводу, полученному в результате всех предыдущих вызовов метода [`decompress()`](https://python-all.ru/3.4/library/zlib.html#zlib.decompress). Часть входных данных может сохраняться во внутренних буферах для последующей обработки.

Если необязательный параметр *max\_length* не равен нулю, то возвращаемое значение будет не длиннее *max\_length*. Это может означать, что не все сжатые входные данные могут быть обработаны; а необработанные данные будут сохранены в атрибуте [`unconsumed_tail`](https://python-all.ru/3.4/library/zlib.html#zlib.Decompress.unconsumed_tail). Эта строка байтов должна быть передана последующему вызову [`decompress()`](https://python-all.ru/3.4/library/zlib.html#zlib.decompress), если распаковка должна продолжаться. Если *max\_length* не указан, то распаковываются все входные данные, и [`unconsumed_tail`](https://python-all.ru/3.4/library/zlib.html#zlib.Decompress.unconsumed_tail) пуст.

#### `Decompress.flush([length])`

Все ожидающие входные данные обрабатываются, и возвращается объект bytes, содержащий оставшиеся несжатые данные. После вызова [`flush()`](https://python-all.ru/3.4/library/zlib.html#zlib.Decompress.flush) метод [`decompress()`](https://python-all.ru/3.4/library/zlib.html#zlib.decompress) больше нельзя вызывать; единственное разумное действие – удалить объект.

Необязательный параметр *length* задаёт начальный размер выходного буфера.

#### `Decompress.copy()`

Возвращает копию объекта распаковки. Это можно использовать для сохранения состояния распаковщика на середине потока данных, чтобы ускорить произвольный доступ к потоку в будущем.

Информацию о версии используемой библиотеки zlib можно получить через следующие константы:

#### `zlib.ZLIB_VERSION`

Строка версии библиотеки zlib, которая использовалась при сборке модуля. Она может отличаться от библиотеки zlib, фактически используемой во время выполнения; последняя доступна как [`ZLIB_RUNTIME_VERSION`](https://python-all.ru/3.4/library/zlib.html#zlib.ZLIB_RUNTIME_VERSION).

#### `zlib.ZLIB_RUNTIME_VERSION`

Строка версии библиотеки zlib, фактически загруженной интерпретатором.

Новое в версии 3.3.

> **См. также**
>
> **Модуль [`gzip`](https://python-all.ru/3.4/library/gzip.html#module-gzip)**
>
> Чтение и запись файлов в формате
>
> **gzip**
>
> .
>
> **[http://www.zlib.net](https://python-all.ru/3.4/library/zlib.html)**
>
> Домашняя страница библиотеки zlib.
>
> **[http://www.zlib.net/manual.html](https://python-all.ru/3.4/library/zlib.html)**
>
> Руководство zlib объясняет семантику и использование многих функций библиотеки.
