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

Функция open() модуля bz2 в Python

Чтение/запись bzip2 архива в двоичном или текстовом режиме

Синтаксис:

import bz2

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

Параметры:

  • filename - имя файла или файловый объект,
  • mode='r' - режим записи/чтения файла,
  • compresslevel=9 - режим сжатия файла,
  • encoding=None - кодировка при текстовом режиме записи/чтения файла,
  • errors=None - обработчик ошибок кодировки при текстовом режиме записи/чтения,
  • newline=None - окончания строк при текстовом режиме записи/чтения.

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

Описание:

Функция open() модуля bz2 открывает сжатый bzip2 файл в двоичном или текстовом режиме для чтения или записи, возвращая объект файла.

Как и в конструкторе для bz2.BZ2File(), аргумент имени файла может быть фактическим именем файла, это объект str или bytes или существующим объектом файла для чтения или записи.

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

Для двоичного режима эта функция bz2.open() эквивалентна конструктору bz2.BZ2File(): bz2.BZ2File(filename, mode, compresslevel=compresslevel). В этом случае аргументы encoding, errors и newline не должны указываться.

Для текстового режима создается объект bz2.BZ2File(), который оборачивается в экземпляр io.TextIOWrapper() с указанным кодированием, поведением обработки ошибок и окончанием(ями) строки newline.

Аргументом уровня сжатия compresslevel является целое число от 1 до 9, как для конструктора bz2.BZ2File().

Примеры использования:

Как читать и сжимать bzip2 файлы в двоичном режиме можно посмотреть в примете описания объекта bz2.BZ2File(). Это основной режим для архивирования и разархивирования всех типов файлов.

Для текстовых файлов которые содержат информацию в Unicode, целесообразнее использовать описанную здесь функцию bz2.open(), которая предоставляет текстовый режим и декодирует текст в байты и наоборот (в зависимости от чтения или записи) на лету.

import bz2, os

# создаем массив данных
text = 'Привет docs-python.ru '
tmp = []
for _ in range(50):
    tmp.append(text*20 + '\n')

# и сразу сжимаем и пишем данные в архив,
# т.к. bz2.open() декодирует текст в байты на лету
with bz2.open('example.bz2', 'wt', encoding='utf-8') as bzw:
    bzw.write('/n/n'.join(tmp))

# смотрим что получилось
>>> os.system('file example.bz2')
# example.bz2: bzip2 compressed data, block size = 900k

Теперь прочитаем архив и выведем часть информации на печать

import bz2, pprint

with bz2.open('example.bz2', 'rt', encoding='utf-8') as bzr:
    data = bzr.read()

# выведем на печать первые 16 символов
print(data[:len(text)])
# Привет docs-python.ru.

# или первую строку
>>> pprint.pprint(data.splitlines()[0], width=60)
('Привет docs-python.ru Привет docs-python.ru Привет docs-python.ru Привет '
 'docs-python.ru Привет docs-python.ru Привет docs-python.ru Привет docs-python.ru '
 'Привет docs-python.ru Привет docs-python.ru Привет docs-python.ru Привет '
 'docs-python.ru Привет docs-python.ru Привет docs-python.ru Привет docs-python.ru '
 'Привет docs-python.ru Привет docs-python.ru Привет docs-python.ru Привет '
 'docs-python.ru Привет docs-python.ru Привет docs-python.ru ')