bz2
— Поддержка сжатия bzip2¶
Исходный код: Lib/bz2.py
Модуль предоставляет исчерпывающий интерфейс для сжатия и распаковки данных с использованием алгоритма сжатия bzip2.
Модуль bz2
содержит:
- Функцию
open()
и классBZ2File
для чтения и записи сжатых файлов. - Классы
BZ2Compressor
иBZ2Decompressor
для инкрементного сжатия-разжатия. - Функции
compress()
иdecompress()
для однокадрового сжатия-разжатия.
Все классы в этом модуле могут быть безопасно доступны из нескольких потоков.
Сжатие-разжатие файлов¶
-
bz2.
open
(filename, mode='r', compresslevel=9, encoding=None, errors=None, newline=None)¶ Открыть bzip2-сжатый файл в двоичном или текстовом режиме, возвратив файловый объект.
Как и в конструкторе
BZ2File
, аргументом filename может быть фактическое имя файла (str
илиbytes
объект) или существующий объект файла для чтения или записи.Аргумент mode может быть любым из
'r'
,'rb'
,'w'
,'wb'
,'x'
,'xb'
,'a'
или'ab'
для двоичного режима или'rt'
,'wt'
,'xt'
или'at'
для текстового режима. Значение по умолчанию -'rb'
.Аргумент compresslevel является целым числом от 1 до 9, как и для конструктора
BZ2File
.Для двоичного режима эта функция эквивалентна конструктору
BZ2File
:BZ2File(filename, mode, compresslevel=compresslevel)
. В этом случае аргументы encoding, errors и newline не должны предоставляться.В текстовом режиме создается
BZ2File
объект, который помещается в инстансio.TextIOWrapper
с указанной кодировкой, поведением обработки ошибок и окончаниями строк.Добавлено в версии 3.3.
Изменено в версии 3.4: Добавлен режим
'x'
(исключающее создание).Изменено в версии 3.6: Принимает путеподобный объект.
-
class
bz2.
BZ2File
(filename, mode='r', buffering=None, compresslevel=9)¶ Открыть bzip2-сжатый файл в двоичном режиме.
Если filename является
str
илиbytes
объектом, открыть именованный файл напрямую. В противном случае filename должен быть файловым объектом, который будет использоваться для чтения или записи сжатых данных.Аргумент mode может быть
'r'
для чтения (по умолчанию),'w'
для перезаписи,'x'
для монопольного создания или'a'
для добавления. Они могут быть эквивалентны'rb'
,'wb'
,'xb'
и'ab'
соответственно.Если filename является объектом файла (а не фактическим именем файла), режим
'w'
не усекает файл, а эквивалентен'a'
.Аргумент buffering игнорируется. Его использование устарело с Python 3.0.
Если mode
'w'
или'a'
, compresslevel может быть целым числом между1
и9
, определяющим степень сжатия:1
обеспечивает наименьшее сжатие, а9
(по умолчанию) - наибольшее сжатие.Если mode является
'r'
, входной файл может представлять собой конкатенацию множества сжатых потоков.BZ2File
предоставляет все элементы, указанныеio.BufferedIOBase
, за исключениемdetach()
иtruncate()
. Поддерживаются итерация и операторwith
.BZ2File
также предоставляет следующий метод:-
peek
([n])¶ Возвращает буферизованные данные без продвижения позиции файла. Будет возвращать, по крайней мере, один байт данных (если только при EOF). Точное число возвращаемых байтов не указано.
Примечание
При вызове
peek()
положение файлаBZ2File
не изменяется, но может измениться положение базового объекта файла (например, еслиBZ2File
был создан путем передачи объекта файла для filename).Добавлено в версии 3.3.
Не рекомендуется, начиная с версии 3.0: Ключевой аргумент buffering устарел и теперь игнорируется.
Изменено в версии 3.1: Добавлена поддержка оператора
with
.Изменено в версии 3.3: Были добавлены методы
fileno()
,readable()
,seekable()
,writable()
,read1()
иreadinto()
.Изменено в версии 3.3: Теперь filename может являться файловым объектом, а не фактическим именем файла.
Изменено в версии 3.3: Был добавлен режим
'a'
(добавление) вместе с поддержкой чтения многопоточных файлов.Изменено в версии 3.4: Добавлен режим
'x'
(исключающее создание).Изменено в версии 3.5: Теперь метод
read()
принимает аргументNone
.Изменено в версии 3.6: Принимает путеподобный объект.
-
Инкрементальное сжатие-разжатие¶
-
class
bz2.
BZ2Compressor
(compresslevel=9)¶ Создаёт новый объект компрессора. Этот объект может быть использован для инкрементального сжатия данных. Для однокадрового сжатия используйте функцию
compress()
.compresslevel, если указано, должно быть целым числом от
1
до9
. Значение по умолчанию -9
.-
compress
(data)¶ Предоставить данные объекту компрессора. Возвращает порцию сжатых данных, если это возможно, или пустой байт строки в противном случае.
Завершив предоставление данных компрессору, вызовите
flush()
метод для завершения процесса сжатия.
-
flush
()¶ Завершить процесс сжатия. Возвращает сжатые данные, оставшиеся во внутренних буферах.
Объект компрессора не может быть использован после вызова этого метода.
-
-
class
bz2.
BZ2Decompressor
¶ Создаёт новый объект декомпрессора. Этот объект может быть использован для инкрементной распаковки данных. Для однокадрового сжатия используйте вместо этого функцию
decompress()
.Примечание
Класс не обеспечивает прозрачную обработку входных данных, содержащих несколько сжатых потоков, в отличие от
decompress()
иBZ2File
. Если необходимо распаковать многоточечный вход с помощьюBZ2Decompressor
, необходимо использовать новый распаковщик для каждого потока.-
decompress
(data, max_length=-1)¶ Распаковка data (байтоподобного объекта), возвращая несжатые данные в виде байтов. Некоторые из data могут быть буферизованы внутри системы для использования в последующих вызовах на
decompress()
. Возвращаемые данные должны быть объединены с выводом всех предыдущих вызовов наdecompress()
.Если max_length является неотрицательным, возвращает не более max_length байт разуплотненных данных. Если этот предел достигнут и возможен дальнейший вывод, атрибут
needs_input
будет установлен вFalse
. В этом случае следующий вызовdecompress()
может обеспечить data какb''
для получения большего количества выходных данных.Если все входные данные были распакованы и возвращены (либо из-за того, что они были меньше max_length байт, либо из-за отрицательного max_length), атрибут
needs_input
будет установлен вTrue
.Попытка распаковки данных после достижения конца потока вызывает EOFError. Любые данные, найденные после окончания потока, игнорируются и сохраняются в атрибуте
unused_data
.Изменено в версии 3.5: Добавлен параметр max_length.
-
eof
¶ True
, достигнут ли маркер конца потока.Добавлено в версии 3.3.
-
unused_data
¶ Данные найдены после окончания сжатого потока.
Если доступ к этому атрибуту осуществляется до достижения конца потока, его значение будет
b''
.
-
needs_input
¶ False
, может ли методdecompress()
предоставляет больше разуплотненных данных до того, как потребуется новый несжатый ввод.Добавлено в версии 3.5.
-
Одноразовое сжатие-разжатие¶
-
bz2.
compress
(data, compresslevel=9)¶ Сжать data, байтоподобный объект.
Если указано compresslevel, то должно быть целым числом от
1
до9
. Значение по умолчанию -9
.Для инкрементного сжатия используйте
BZ2Compressor
.
-
bz2.
decompress
(data)¶ Декомпрессия data, байтоподобного объекта.
Если data является конкатенацией нескольких сжатых потоков, распакуйте все потоки.
Для инкрементной декомпрессии используйте
BZ2Decompressor
.Изменено в версии 3.3: Добавлена поддержка многоточечных входов.
Примеры использования¶
Ниже приведены примеры типичного использования модуля bz2
.
Использование compress()
и decompress()
для демонстрации двунаправленного сжатия:
>>> import bz2
>>> data = b"""\
... Donec rhoncus quis sapien sit amet molestie. Fusce scelerisque vel augue
... nec ullamcorper. Nam rutrum pretium placerat. Aliquam vel tristique lorem,
... sit amet cursus ante. In interdum laoreet mi, sit amet ultrices purus
... pulvinar a. Nam gravida euismod magna, non varius justo tincidunt feugiat.
... Aliquam pharetra lacus non risus vehicula rutrum. Maecenas aliquam leo
... felis. Pellentesque semper nunc sit amet nibh ullamcorper, ac elementum
... dolor luctus. Curabitur lacinia mi ornare consectetur vestibulum."""
>>> c = bz2.compress(data)
>>> len(data) / len(c) # Степень сжатия данных
1.513595166163142
>>> d = bz2.decompress(c)
>>> data == d # Проверить равенство исходному объекту после приема-передачи
True
Использование BZ2Compressor
для инкрементного сжатия:
>>> import bz2
>>> def gen_data(chunks=10, chunksize=1000):
... """Yield инкрементные блоки байтов размера чангов."""
... for _ in range(chunks):
... yield b"z" * chunksize
...
>>> comp = bz2.BZ2Compressor()
>>> out = b""
>>> for chunk in gen_data():
... # Предоставляет данные объекту-компрессору
... out = out + comp.compress(chunk)
...
>>> # Завершение процесса сжатия. Вызовать его, как только вы закончите
>>> # предоставление данных компрессору.
>>> out = out + comp.flush()
В приведенном выше примере используется поток данных «nonrandom» (поток чангов b»z»). Случайные данные имеют тенденцию плохо сжиматься, хотя упорядоченные повторяющиеся данные обычно дают высокую степень сжатия.
Запись и чтение bzip2-сжатого файла в двоичном режиме:
>>> import bz2
>>> data = b"""\
... Donec rhoncus quis sapien sit amet molestie. Fusce scelerisque vel augue
... nec ullamcorper. Nam rutrum pretium placerat. Aliquam vel tristique lorem,
... sit amet cursus ante. In interdum laoreet mi, sit amet ultrices purus
... pulvinar a. Nam gravida euismod magna, non varius justo tincidunt feugiat.
... Aliquam pharetra lacus non risus vehicula rutrum. Maecenas aliquam leo
... felis. Pellentesque semper nunc sit amet nibh ullamcorper, ac elementum
... dolor luctus. Curabitur lacinia mi ornare consectetur vestibulum."""
>>> with bz2.open("myfile.bz2", "wb") as f:
... # Записать сжатые данные в файл
... unused = f.write(data)
>>> with bz2.open("myfile.bz2", "rb") as f:
... # Распаковать данные из файла
... content = f.read()
>>> content == data # Проверить равенство оригинальному объекту после компрессии и декомпрессии
True