bz2
— Поддержка сжатия bzip2¶
Исходный код: Lib/bz2.py.
Этот модуль предоставляет комплексный интерфейс для сжатия и распаковки данных с использованием алгоритма сжатия bzip2.
Модуль bz2
содержит:
Функция
open()
и классBZ2File
для чтения и записи сжатых файлов.Классы
BZ2Compressor
иBZ2Decompressor
для инкрементного (де)сжатия.Функции
compress()
иdecompress()
для одномоментного (де)сжатия.
(Де)сжатие файлов¶
-
bz2.
open
(filename, mode='rb', compresslevel=9, encoding=None, errors=None, newline=None)¶ Открыть bzip2-сжатый файл в двоичном или текстовом режиме, возвращая file object.
Как и в конструкторе для
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: Принимает path-like object.
-
class
bz2.
BZ2File
(filename, mode='r', *, compresslevel=9)¶ Открыть файл, сжатый bzip2, в двоичном режиме.
Если filename является объектом
str
илиbytes
, откройте именованный файл напрямую. В противном случае filename должно быть объектом file object, который будет использоваться для чтения или записи сжатых данных.Аргумент mode может быть либо
'r'
для чтения (по умолчанию),'w'
для перезаписи,'x'
для эксклюзивного создания, либо'a'
для добавления. Эквивалентно они могут быть заданы как'rb'
,'wb'
,'xb'
и'ab'
соответственно.Если filename является объектом файла (а не реальным именем файла), режим
'w'
не усекает файл, а эквивалентен'a'
.Если 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.1: Добавлена поддержка оператора
with
.Изменено в версии 3.3: Добавлены методы
fileno()
,readable()
,seekable()
,writable()
,read1()
иreadinto()
.Изменено в версии 3.3: Добавлена поддержка для filename, представляющего собой file object вместо фактического имени файла.
Изменено в версии 3.3: Был добавлен режим
'a'
(append), а также поддержка чтения многопотоковых файлов.Изменено в версии 3.4: Добавлен режим
'x'
(эксклюзивное создание).Изменено в версии 3.5: Метод
read()
теперь принимает аргументNone
.Изменено в версии 3.6: Принимает path-like object.
Изменено в версии 3.9: Параметр buffering был удален. Он игнорировался и был устаревшим с Python 3.0. Передайте объект открытого файла, чтобы контролировать способ открытия файла.
Параметр compresslevel стал включать только ключевые слова.
-
Инкрементное (де)сжатие¶
-
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 (a bytes-like object), возвращая несжатые данные в виде байтов. Часть данных может быть буферизована внутри, для использования в последующих вызовах
decompress()
. Возвращенные данные должны быть конкатенированы с результатами предыдущих вызововdecompress()
.Если max_length неотрицательна, возвращается не более max_length байт распакованных данных. Если этот предел достигнут и дальнейший вывод может быть произведен, атрибут
needs_input
будет установлен вFalse
. В этом случае следующий вызовdecompress()
может предоставить данные в качестве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)¶ Сжать данные, а bytes-like object.
compresslevel, если задан, должен быть целым числом между
1
и9
. По умолчанию используется значение9
.Для инкрементного сжатия вместо него используйте
BZ2Compressor
.
-
bz2.
decompress
(data)¶ Декомпрессия данных, a bytes-like object.
Если данные являются конкатенацией нескольких сжатых потоков, распакуйте все потоки.
Для постепенной распаковки используйте вместо него
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) # Data compression ratio
1.513595166163142
>>> d = bz2.decompress(c)
>>> data == d # Check equality to original object after round-trip
True
Использование BZ2Compressor
для инкрементного сжатия:
>>> import bz2
>>> def gen_data(chunks=10, chunksize=1000):
... """Yield incremental blocks of chunksize bytes."""
... for _ in range(chunks):
... yield b"z" * chunksize
...
>>> comp = bz2.BZ2Compressor()
>>> out = b""
>>> for chunk in gen_data():
... # Provide data to the compressor object
... out = out + comp.compress(chunk)
...
>>> # Finish the compression process. Call this once you have
>>> # finished providing data to the compressor.
>>> out = out + comp.flush()
В приведенном примере используется очень «неслучайный» поток данных (поток из 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:
... # Write compressed data to file
... unused = f.write(data)
>>> with bz2.open("myfile.bz2", "rb") as f:
... # Decompress data from file
... content = f.read()
>>> content == data # Check equality to original object after round-trip
True