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 ')