Содержание страницы
bz2 – Поддержка сжатия bzip2¶bz2 – Support for bzip2 compression
Исходный код: Lib/bz2.py
Этот модуль предоставляет полный интерфейс для сжатия и распаковки данных с использованием алгоритма сжатия bzip2.
Модуль bz2 содержит:
Функция
open()и классBZ2Fileдля чтения и записи сжатых файлов.Классы
BZ2CompressorиBZ2Decompressorдля инкрементального сжатия и распаковки.Функции
compress()иdecompress()для одноразового сжатия и распаковки.
Сжатие и распаковка файлов¶(De)compression of files
- bz2.open(filename, mode='rb', 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', *, compresslevel=9)¶
Открывает сжатый bzip2 файл в бинарном режиме.
Если filename – объект
strилиbytes, открыть указанный файл напрямую. В противном случае filename должен быть файловым объектом, который будет использоваться для чтения или записи сжатых данных.Аргумент 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])¶
Возвращает буферизованные данные без продвижения файловой позиции. Будет возвращён как минимум один байт данных (если не достигнут конец файла). Точное количество возвращаемых байт не указано.
Примечание
Хотя вызов
peek()не меняет файловую позициюBZ2File, он может изменить позицию нижележащего файлового объекта (например, еслиBZ2Fileбыл создан путём передачи файлового объекта в качестве filename).Новое в версии 3.3.
- fileno()¶
Возвращает файловый дескриптор базового файла.
Новое в версии 3.3.
- readable()¶
Возвращает, был ли файл открыт для чтения.
Новое в версии 3.3.
- seekable()¶
Возвращает, поддерживает ли файл позиционирование.
Новое в версии 3.3.
- writable()¶
Возвращает, был ли файл открыт для записи.
Новое в версии 3.3.
- read1(size=-1)¶
Читает не более size несжатых байт, стараясь не выполнять несколько операций чтения из нижележащего потока. Если size отрицателен, читает данные объёмом до одного буфера.
Возвращает
b'', если достигнут конец файла (EOF).Новое в версии 3.3.
- readinto(b)¶
Читает байты в b.
Возвращает количество прочитанных байт (0 – конец файла).
Новое в версии 3.3.
Изменено в версии 3.1: Добавлена поддержка оператора
with.Изменено в версии 3.3: Добавлена поддержка передачи filename в качестве файлового объекта вместо реального имени файла.
Добавлен режим
'a'(добавление) и поддержка чтения файлов с несколькими потоками.Изменено в версии 3.4: Добавлен режим
'x'(эксклюзивное создание).Изменено в версии 3.5: Метод
read()теперь принимает аргумент типаNone.Изменено в версии 3.6: Принимает объект, подобный пути.
Изменено в версии 3.9: Параметр buffering был удалён. Он игнорировался и считался устаревшим начиная с Python 3.0. Для управления открытием файла передавайте открытый файловый объект.
Параметр compresslevel стал строго именованным аргументом.
Инкрементальное (де)сжатие¶Incremental (de)compression
- 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.
Одноразовое (де)сжатие¶One-shot (de)compression
- bz2.compress(data, compresslevel=9)¶
Сжимает data, байтоподобный объект.
compresslevel, если указан, должен быть целым числом между
1и9. По умолчанию9.Для инкрементального сжатия используйте
BZ2Compressor.
- bz2.decompress(data)¶
Декомпрессирует data, байтоподобный объект.
Если data является объединением нескольких сжатых потоков, декомпрессирует все потоки.
Для инкрементальной декомпрессии используйте
BZ2Decompressor.Изменено в версии 3.3: Добавлена поддержка многопоточных входных данных.
Примеры использования¶Examples of usage
Ниже приведены несколько примеров типичного использования модуля 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):
... """Выдаёт инкрементальные блоки по chunksize байт."""
... 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()
В приведённом примере используется очень «неслучайный» поток данных
(поток фрагментов 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