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

---

# 13.3. [`bz2`](https://python-all.ru/3.5/library/bz2.html#module-bz2) – Поддержка сжатия **bzip2**

**Исходный код:** [Lib/bz2.py](https://python-all.ru/src/3.5/Lib/bz2.py)

---

Этот модуль предоставляет полный интерфейс для сжатия и распаковки данных с использованием алгоритма сжатия bzip2.

Модуль [`bz2`](https://python-all.ru/3.5/library/bz2.html#module-bz2) содержит:

- Функция [`open()`](https://python-all.ru/3.5/library/bz2.html#bz2.open) и класс [`BZ2File`](https://python-all.ru/3.5/library/bz2.html#bz2.BZ2File) для чтения и записи сжатых файлов.
- Классы [`BZ2Compressor`](https://python-all.ru/3.5/library/bz2.html#bz2.BZ2Compressor) и [`BZ2Decompressor`](https://python-all.ru/3.5/library/bz2.html#bz2.BZ2Decompressor) для инкрементального сжатия и распаковки.
- Функции [`compress()`](https://python-all.ru/3.5/library/bz2.html#bz2.compress) и [`decompress()`](https://python-all.ru/3.5/library/bz2.html#bz2.decompress) для одноразового сжатия и распаковки.

Все классы в этом модуле можно безопасно использовать из нескольких потоков.

## 13.3.1. Сжатие и распаковка файлов

#### `bz2.open(filename, mode='r', compresslevel=9, encoding=None, errors=None, newline=None)`

Открывает сжатый bzip2 файл в бинарном или текстовом режиме, возвращая [файловый объект](https://python-all.ru/3.5/glossary.html#term-file-object).

Как и в случае с конструктором [`BZ2File`](https://python-all.ru/3.5/library/bz2.html#bz2.BZ2File), аргумент *filename* может быть фактическим именем файла (объектом [`str`](https://python-all.ru/3.5/library/stdtypes.html#str) или [`bytes`](https://python-all.ru/3.5/library/functions.html#bytes)) или существующим файловым объектом для чтения или записи.

Аргумент *mode* может быть любым из `'r'`, `'rb'`, `'w'`, `'wb'`, `'x'`, `'xb'`, `'a'` или `'ab'` для бинарного режима, или `'rt'`, `'wt'`, `'xt'` или `'at'` для текстового режима. По умолчанию `'rb'`.

Аргумент *compresslevel* – целое число от 1 до 9, как и у конструктора [`BZ2File`](https://python-all.ru/3.5/library/bz2.html#bz2.BZ2File).

В бинарном режиме эта функция эквивалентна конструктору [`BZ2File`](https://python-all.ru/3.5/library/bz2.html#bz2.BZ2File): `BZ2File(filename, mode, compresslevel=compresslevel)`. В этом случае аргументы *encoding*, *errors* и *newline* не должны передаваться.

Для текстового режима создаётся объект [`BZ2File`](https://python-all.ru/3.5/library/bz2.html#bz2.BZ2File), обёрнутый в экземпляр [`io.TextIOWrapper`](https://python-all.ru/3.5/library/io.html#io.TextIOWrapper) с указанными кодировкой, поведением при ошибках и символами конца строки.

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

Изменено в версии 3.4: Добавлен режим `'x'` (эксклюзивное создание).

#### `class bz2.BZ2File(filename, mode='r', buffering=None, compresslevel=9)`

Открывает сжатый bzip2 файл в бинарном режиме.

Если *filename* – объект [`str`](https://python-all.ru/3.5/library/stdtypes.html#str) или [`bytes`](https://python-all.ru/3.5/library/functions.html#bytes), открыть указанный файл напрямую. В противном случае *filename* должен быть [файловым объектом](https://python-all.ru/3.5/glossary.html#term-file-object), который будет использоваться для чтения или записи сжатых данных.

Аргумент *mode* может быть `'r'` для чтения (по умолчанию), `'w'` для перезаписи, `'x'` для исключительного создания или `'a'` для добавления. Им эквивалентно соответствуют `'rb'`, `'wb'`, `'xb'` и `'ab'` соответственно.

Если *filename* – файловый объект (а не фактическое имя файла), режим `'w'` не усекает файл, а вместо этого эквивалентен `'a'`.

Аргумент *buffering* игнорируется. Его использование устарело.

Если *mode* равен `'w'` или `'a'`, то *compresslevel* может быть числом между `1` и `9`, задающим степень сжатия: `1` дает наименьшее сжатие, а `9` (по умолчанию) – наибольшее.

Если *mode* – `'r'`, входной файл может быть объединением нескольких сжатых потоков.

[`BZ2File`](https://python-all.ru/3.5/library/bz2.html#bz2.BZ2File) предоставляет все члены, определённые в [`io.BufferedIOBase`](https://python-all.ru/3.5/library/io.html#io.BufferedIOBase), за исключением `detach()` и `truncate()`. Поддерживаются итерация и оператор [`with`](https://python-all.ru/3.5/reference/compound_stmts.html#with).

[`BZ2File`](https://python-all.ru/3.5/library/bz2.html#bz2.BZ2File) также предоставляет следующий метод:

#### `peek([n])`

Возвращает буферизованные данные без продвижения файловой позиции. Будет возвращён как минимум один байт данных (если не достигнут конец файла). Точное количество возвращаемых байт не указано.

> **Примечание**
>
> Хотя вызов [`peek()`](https://python-all.ru/3.5/library/bz2.html#bz2.BZ2File.peek) не меняет файловую позицию [`BZ2File`](https://python-all.ru/3.5/library/bz2.html#bz2.BZ2File), он может изменить позицию нижележащего файлового объекта (например, если [`BZ2File`](https://python-all.ru/3.5/library/bz2.html#bz2.BZ2File) был создан путём передачи файлового объекта в качестве *filename*).

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

Изменено в версии 3.1: Добавлена поддержка оператора [`with`](https://python-all.ru/3.5/reference/compound_stmts.html#with).

Изменено в версии 3.3: добавлены методы `fileno()`, `readable()`, `seekable()`, `writable()`, `read1()` и `readinto()`.

Изменено в версии 3.3: Добавлена поддержка передачи *filename* в качестве [файлового объекта](https://python-all.ru/3.5/glossary.html#term-file-object) вместо реального имени файла.

Изменено в версии 3.3: добавлен режим `'a'` (дозапись), а также поддержка чтения многофайловых потоков.

Изменено в версии 3.4: Добавлен режим `'x'` (эксклюзивное создание).

Изменено в версии 3.5: Метод [`read()`](https://python-all.ru/3.5/library/io.html#io.BufferedIOBase.read) теперь принимает аргумент типа `None`.

## 13.3.2. Инкрементальное сжатие и распаковка

#### `class bz2.BZ2Compressor(compresslevel=9)`

Создаёт новый объект компрессора. Этот объект можно использовать для инкрементального сжатия данных. Для однократного сжатия используйте функцию [`compress()`](https://python-all.ru/3.5/library/bz2.html#bz2.compress).

*compresslevel*, если указан, должен быть числом от `1` до `9`. По умолчанию `9`.

#### `compress(data)`

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

После завершения передачи данных компрессору следует вызвать метод [`flush()`](https://python-all.ru/3.5/library/bz2.html#bz2.BZ2Compressor.flush) для завершения процесса сжатия.

#### `flush()`

Завершает процесс сжатия. Возвращает сжатые данные, оставшиеся во внутренних буферах.

Объект компрессора нельзя использовать после вызова этого метода.

#### `class bz2.BZ2Decompressor`

Создаёт новый объект декомпрессора. Этот объект можно использовать для инкрементальной декомпрессии данных. Для одноразового сжатия используйте функцию [`decompress()`](https://python-all.ru/3.5/library/bz2.html#bz2.decompress) вместо этого.

> **Примечание**
>
> Этот класс не обрабатывает прозрачно входные данные, содержащие несколько сжатых потоков, в отличие от [`decompress()`](https://python-all.ru/3.5/library/bz2.html#bz2.decompress) и [`BZ2File`](https://python-all.ru/3.5/library/bz2.html#bz2.BZ2File). Если необходимо декомпрессировать многопоточный вход с помощью [`BZ2Decompressor`](https://python-all.ru/3.5/library/bz2.html#bz2.BZ2Decompressor), нужно использовать новый декомпрессор для каждого потока.

#### `decompress(data, max_length=-1)`

Декомпрессирует *data* ([байтоподобный объект](https://python-all.ru/3.5/glossary.html#term-bytes-like-object)), возвращая несжатые данные в виде байтов. Часть *data* может буферизироваться внутренне для использования в последующих вызовах [`decompress()`](https://python-all.ru/3.5/library/bz2.html#bz2.decompress). Возвращаемые данные следует объединять с результатом любых предыдущих вызовов [`decompress()`](https://python-all.ru/3.5/library/bz2.html#bz2.decompress).

Если *max\_length* неотрицательно, возвращает не более *max\_length* байтов декомпрессированных данных. Если этот лимит достигнут и может быть сгенерирован дальнейший вывод, атрибут [`needs_input`](https://python-all.ru/3.5/library/bz2.html#bz2.BZ2Decompressor.needs_input) будет установлен в `False`. В этом случае следующий вызов [`decompress()`](https://python-all.ru/3.5/library/bz2.html#bz2.BZ2Decompressor.decompress) может передать *data* как `b''` для получения ещё вывода.

Если все входные данные были декомпрессированы и возвращены (либо потому что это было меньше *max\_length* байтов, либо потому что *max\_length* было отрицательным), атрибут [`needs_input`](https://python-all.ru/3.5/library/bz2.html#bz2.BZ2Decompressor.needs_input) будет установлен в `True`.

Попытка распаковать данные после достижения конца потока вызывает исключение *EOFError*. Любые данные, обнаруженные после конца потока, игнорируются и сохраняются в атрибуте [`unused_data`](https://python-all.ru/3.5/library/bz2.html#bz2.BZ2Decompressor.unused_data).

Изменено в версии 3.5: Добавлен параметр *max\_length*.

#### `eof`

`True`, если достигнут маркер конца потока.

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

#### `unused_data`

Данные, обнаруженные после конца сжатого потока.

Если к этому атрибуту обратиться до достижения конца потока, его значение будет `b''`.

#### `needs_input`

`False`, если метод [`decompress()`](https://python-all.ru/3.5/library/bz2.html#bz2.BZ2Decompressor.decompress) может предоставить больше декомпрессированных данных до запроса нового несжатого входа.

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

## 13.3.3. Одношаговое сжатие и распаковка

#### `bz2.compress(data, compresslevel=9)`

Сжать *data*.

*compresslevel*, если указан, должен быть числом от `1` до `9`. По умолчанию `9`.

Для инкрементального сжатия используйте [`BZ2Compressor`](https://python-all.ru/3.5/library/bz2.html#bz2.BZ2Compressor).

#### `bz2.decompress(data)`

Распаковать *data*.

Если *data* является объединением нескольких сжатых потоков, декомпрессирует все потоки.

Для инкрементальной декомпрессии используйте [`BZ2Decompressor`](https://python-all.ru/3.5/library/bz2.html#bz2.BZ2Decompressor).

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