import bz2 fbz = bz2.BZ2File(filename, mode='r', buffering=None, compresslevel=9)
filename
- имя файла,mode='r'
- режим чтения/записи,buffering=None
- буферизация,compresslevel=9
- int, режим сжатия.Класс BZ2File()
модуля bz2
открывает bzip2-сжатый файл в двоичном режиме для чтения или записи.
Если аргумент filename
является str
или bytes
объектом, то этот файл открывается напрямую. В противном случае это должен быть файловый объект, который будет использоваться для чтения или записи сжатых данных.
Аргумент mode
может быть:
'r'
для чтения (по умолчанию), 'w'
для перезаписи, 'x'
для эксклюзивного создания,'a'
для добавления данных. Они могут быть эквивалентно заданы как 'rb'
, 'wb'
, 'xb'
и 'ab'
соответственно.
Если аргумент filename
является файловым объектом, а не фактическим именем файла, то режим 'w'
не удаляет данные из файла, а эквивалентен 'a'
.
Если аргумент mode
равен 'w'
или 'a'
, то уровень сжатия compresslevel
может быть целым числом от 1 до 9, указывающим уровень сжатия: 1 производит наименьшее сжатие, а 9 (по умолчанию) производит наибольшее сжатие.
Если аргумент mode
равен 'r'
, то входной файл может быть объединением нескольких сжатых потоков.
Экземпляр bz2.BZ2File()
предоставляет все методы, указанные в io.BufferedIOBase
за исключением методов detach()
и truncate()
. Итерация и оператор with
поддерживаются.
Аргумент buffering
устарел с версии Python-3.0 и игнорируется.
BZ2File
.fbz.peek([n])
:Метод fbz.peek([n])
возвращает буферизированные данные без изменения позиции в файле. По крайней мере один байт данных будет возвращен, если это не конец файла EOF. Точное количество возвращаемых байтов не указано.
Обратите внимание, хотя вызов fbz.peek()
не меняет файловую позицию в объекте BZ2File, он может изменить позицию базового файлового объекта, например если в конструктор класса bz2.BZ2File()
аргументу filename
передан файловый объект.
Создадим массив данных и заархивируем его в файл.
import bz2, os # создаем массив данных text = 'Привет Мир. ' tmp = [] for _ in range(50): tmp.append(text*50 + '\n') # файл для записи текста txt_file = 'test.txt' # пишем текст в файл with open(txt_file, 'w') as fp: fp.write('\n\n'.join(tmp)) # файл для архива. bzip2_file = 'test.bzip2' # Открываем оба файла в бинарном режиме # на чтение текстовый файл функцией open() и # на запись файл `test.bzip2` при помощи bz2.BZ2File # далее из текстового файла читаем в `test.bzip2` пишем with open(txt_file, 'rb') as fp, bz2.BZ2File(bzip2_file, 'wb', compresslevel=9) as bz: data = fp.read() bz.write(data) # смотрим что получилось >>> os.system(f'file {bzip2_file}') # test.bzip2: bzip2 compressed data, block size = 900k # смотрим объем файлов в байтах >>> os.path.getsize(txt_file) # 52648 >>> os.path.getsize(bzip2_file) # 96
Для того, что бы собрать .bzip2
архив из нескольких файлов стоит посмотреть в сторону модуля tarfile
.
Теперь распакуем полученный bzip2 файл.
import bz2, os txt_file = 'unpack-test.txt' bzip2_file = 'test.bzip2' # Открываем оба файла в бинарном режиме # и делаем все наоборот, из сжатого файла читаем # в текстовый файл пишем. ВСЕ! with open(txt_file, 'wb') as fpw, bz2.BZ2File(bzip2_file, 'rb') as bzr: data = bzr.read() fpw.write(data) # смотрим что получилось >>> os.system(f'file {txt_file}') # unpack-test.txt: UTF-8 Unicode text, with very long lines