Spec-Zone.ru › Python 3.14

bz2 — Поддержка сжатия bzip2

Исходный код: Lib/bz2.py

Этот модуль предоставляет полнофункциональный интерфейс для сжатия и распаковки данных с использованием алгоритма сжатия bzip2.

Модуль bz2 содержит:

  • Функцию open() и класс BZ2File для чтения и записи сжатых файлов.
  • Классы BZ2Compressor и BZ2Decompressor для инкрементального сжатия и распаковки.
  • Функции compress() и decompress() для однократного сжатия и распаковки.

Это необязательный модуль. Если в вашей копии CPython он отсутствует, обратитесь к документации вашего дистрибутива (то есть к тому, кто предоставил вам Python). Если вы являетесь разработчиком дистрибутива, см. Требования к необязательным модулям.

Сжатие и распаковка файлов

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'', если достигнут конец файла.

Добавлено в версии 3.3.

readinto(b)

Читает байты в b.

Возвращает количество прочитанных байтов (0 в конце файла).

Добавлено в версии 3.3.

mode

'rb' для чтения и 'wb' для записи.

Добавлено в версии 3.13.

name

Имя файла bzip2. Эквивалентно атрибуту name базового файлового объекта.

Добавлено в версии 3.13.

Изменено в версии 3.1: Добавлена поддержка оператора with.

Изменено в версии 3.3: Добавлена поддержка файлового объекта файлового объекта в качестве filename вместо имени файла.

Добавлен режим 'a' (добавление в конец файла), а также поддержка чтения файлов с несколькими потоками.

Изменено в версии 3.4: Добавлен режим 'x' (эксклюзивное создание).

Изменено в версии 3.5: Метод read() теперь принимает аргумент типа None.

Изменено в версии 3.6: Принимает объект, подобный пути.

Изменено в версии 3.9: Параметр buffering удалён. Он игнорировался и считался устаревшим начиная с Python 3.0. Чтобы управлять открытием файла, передайте открытый файловый объект.

Параметр compresslevel стал только именованным.

Изменено в версии 3.10: Этот класс не является потокобезопасным при одновременном чтении или записи несколькими потоками, как и соответствующие классы в модулях gzip и lzma.

Инкрементальное сжатие и распаковка

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 (объект типа bytes) и возвращает распакованные данные в виде байтов. Часть 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 — объект типа bytes.

Если указан аргумент compresslevel, он должен быть целым числом от 1 до 9. Значение по умолчанию — 9.

Для инкрементального сжатия используйте BZ2Compressor.

bz2.decompress(data)

Распаковывает data — объект типа bytes.

Если 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)  # 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

© 2001 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/library/bz2.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API