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

---

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

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

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

- Функция [`open()`](https://python-all.ru/3.4/library/bz2.html#bz2.open) и класс [`BZ2File`](https://python-all.ru/3.4/library/bz2.html#bz2.BZ2File) для чтения и записи сжатых файлов.
- Классы [`BZ2Compressor`](https://python-all.ru/3.4/library/bz2.html#bz2.BZ2Compressor) и [`BZ2Decompressor`](https://python-all.ru/3.4/library/bz2.html#bz2.BZ2Decompressor) для инкрементального (де)сжатия.
- Функции [`compress()`](https://python-all.ru/3.4/library/bz2.html#bz2.compress) и [`decompress()`](https://python-all.ru/3.4/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.4/glossary.html#term-file-object).

Как и в конструкторе [`BZ2File`](https://python-all.ru/3.4/library/bz2.html#bz2.BZ2File), аргумент *filename* может быть фактическим именем файла (объект [`str`](https://python-all.ru/3.4/library/stdtypes.html#str) или [`bytes`](https://python-all.ru/3.4/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.4/library/bz2.html#bz2.BZ2File).

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

Для текстового режима создаётся объект [`BZ2File`](https://python-all.ru/3.4/library/bz2.html#bz2.BZ2File), который оборачивается в экземпляр [`io.TextIOWrapper`](https://python-all.ru/3.4/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.4/library/stdtypes.html#str) или [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes), то файл открывается напрямую. В противном случае *filename* должен быть [*файловым объектом*](https://python-all.ru/3.4/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.4/library/bz2.html#bz2.BZ2File) предоставляет все члены, определённые в [`io.BufferedIOBase`](https://python-all.ru/3.4/library/io.html#io.BufferedIOBase), за исключением `detach()` и `truncate()`. Поддерживаются итерация и оператор [`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#### `compress(data)`

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

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

#### `flush()`

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

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

#### `class bz2.BZ2Decompressor`

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

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

#### `decompress(data)`

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

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

#### `eof`

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

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

#### `unused_data`

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

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

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

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

Сжать *data*.

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

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

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

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

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

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

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