Código fuente:Lib / bz2.py

Este módulo proporciona una interfaz completa para comprimir y descomprimir datos utilizando el algoritmo de compresión bzip2.

los bz2 el módulo contiene:

  • los open() función y BZ2File clase para leer y escribir archivos comprimidos.
  • los BZ2Compressor y BZ2Decompressor clases para la (des) compresión incremental.
  • los compress() y decompress() funciones para la (des) compresión de un disparo.

Se puede acceder de forma segura a todas las clases de este módulo desde varios subprocesos.

(Des) compresión de archivos

bz2.open(filename, mode='rb', compresslevel=9, encoding=None, errors=None, newline=None)

Abra un archivo comprimido con bzip2 en modo binario o texto, devolviendo un objeto de archivo.

Al igual que con el constructor de BZ2File, los nombre del archivo El argumento puede ser un nombre de archivo real (un str o bytes objeto), o un objeto de archivo existente para leer o escribir.

los modo El argumento puede ser cualquiera de 'r', 'rb', 'w', 'wb', 'x', 'xb', 'a' o 'ab' para modo binario, o 'rt', 'wt', 'xt', o 'at' para el modo de texto. El valor predeterminado es 'rb'.

los nivel de compresión argumento es un número entero de 1 a 9, como para el BZ2File constructor.

Para el modo binario, esta función es equivalente a la BZ2File constructor: BZ2File(filename, mode, compresslevel=compresslevel). En este caso, el codificacion, errores y nueva línea no se deben proporcionar argumentos.

Para el modo de texto, un BZ2File El objeto se crea y se envuelve en un io.TextIOWrapper instancia con la codificación especificada, el comportamiento de manejo de errores y las terminaciones de línea.

Nuevo en la versión 3.3.

Modificado en la versión 3.4: los 'x' Se agregó el modo (creación exclusiva).

Modificado en la versión 3.6: Acepta un objeto parecido a una ruta.

class bz2.BZ2File(filename, mode='r', *, compresslevel=9)

Abra un archivo comprimido con bzip2 en modo binario.

Si nombre del archivo es un str o bytes objeto, abra el archivo nombrado directamente. De lo contrario, nombre del archivo debería ser un objeto de archivo, que se utilizará para leer o escribir los datos comprimidos.

los modo el argumento puede ser 'r' para leer (predeterminado), 'w' para sobrescribir, 'x' para creación exclusiva, o 'a' para agregar. Estos pueden expresarse de forma equivalente como 'rb', 'wb', 'xb' y 'ab' respectivamente.

Si nombre del archivo es un objeto de archivo (en lugar de un nombre de archivo real), un modo de 'w' no trunca el archivo y es equivalente a 'a'.

Si modo es 'w' o 'a', nivel de compresión puede ser un número entero entre 1 y 9 especificando el nivel de compresión: 1 produce la menor compresión, y 9 (predeterminado) produce la mayor compresión.

Si modo es 'r', el archivo de entrada puede ser la concatenación de múltiples flujos comprimidos.

BZ2File proporciona todos los miembros especificados por el io.BufferedIOBase, excepto por detach() y truncate(). Iteración y la with son compatibles.

BZ2File también proporciona el siguiente método:

peek([n])

Devuelve los datos almacenados en búfer sin avanzar en la posición del archivo. Se devolverá al menos un byte de datos (a menos que esté en EOF). El número exacto de bytes devueltos no está especificado.

Nota

Mientras llama peek() no cambia la posición del archivo del BZ2File, puede cambiar la posición del objeto de archivo subyacente (por ejemplo, si el BZ2File fue construido pasando un objeto de archivo para nombre del archivo).

Nuevo en la versión 3.3.

Modificado en la versión 3.1: Soporte para el with se agregó una declaración.

Modificado en la versión 3.3: los fileno(), readable(), seekable(), writable(), read1() y readinto() Se agregaron métodos.

Modificado en la versión 3.3: Se agregó soporte para nombre del archivo ser un objeto de archivo en lugar de un nombre de archivo real.

Modificado en la versión 3.3: los 'a' Se agregó el modo (agregar), junto con la compatibilidad con la lectura de archivos de flujo múltiple.

Modificado en la versión 3.4: los 'x' Se agregó el modo (creación exclusiva).

Modificado en la versión 3.5: los read() El método ahora acepta un argumento de None.

Modificado en la versión 3.6: Acepta un objeto parecido a una ruta.

Modificado en la versión 3.9: los búfer El parámetro ha sido eliminado. Fue ignorado y obsoleto desde Python 3.0. Pase un objeto de archivo abierto para controlar cómo se abre el archivo.

los nivel de compresión el parámetro se convirtió en solo palabra clave.

(Des) compresión incremental

class bz2.BZ2Compressor(compresslevel=9)

Crea un nuevo objeto compresor. Este objeto se puede utilizar para comprimir datos de forma incremental. Para la compresión de una sola vez, utilice el compress() función en su lugar.

nivel de compresión, si se da, debe ser un número entero entre 1 y 9. El valor predeterminado es 9.

compress(data)

Proporciona datos al objeto compresor. Devuelve un fragmento de datos comprimidos si es posible, o un byte vacío string de lo contrario.

Cuando haya terminado de proporcionar datos al compresor, llame al flush() método para finalizar el proceso de compresión.

flush()

Termina el proceso de compresión. Devuelve los datos comprimidos que quedan en los búferes internos.

El objeto del compresor no se puede utilizar después de que se haya llamado a este método.

class bz2.BZ2Decompressor

Cree un nuevo objeto descompresor. Este objeto se puede utilizar para descomprimir datos de forma incremental. Para la compresión de una sola vez, utilice el decompress() función en su lugar.

Nota

Esta clase no maneja de manera transparente las entradas que contienen múltiples flujos comprimidos, a diferencia de decompress() y BZ2File. Si necesita descomprimir una entrada de flujo múltiple con BZ2Decompressor, debe utilizar un descompresor nuevo para cada flujo.

decompress(data, max_length=-1)

Descomprimir datos (a objeto similar a bytes), devolviendo datos sin comprimir como bytes. Algunos de datos puede almacenarse en búfer internamente, para su uso en llamadas posteriores a decompress(). Los datos devueltos deben concatenarse con la salida de cualquier llamada anterior a decompress().

Si longitud máxima no es negativo, devuelve como máximo longitud máxima bytes de datos descomprimidos. Si se alcanza este límite y se pueden producir más resultados, el needs_input attribute se establecerá en False. En este caso, la próxima llamada a decompress() podría proveer datos como b'' para obtener más de la salida.

Si todos los datos de entrada se descomprimieron y se devolvieron (ya sea porque fue menor que longitud máxima bytes, o porque longitud máxima fue negativo), el needs_input attribute se establecerá en True.

Intentar descomprimir los datos después de que se alcanza el final de la transmisión genera un EOFError. Cualquier dato encontrado después del final de la transmisión se ignora y se guarda en el unused_data attribute.

Modificado en la versión 3.5: Agregó el longitud máxima parámetro.

eof

True si se ha alcanzado el marcador de fin de flujo.

Nuevo en la versión 3.3.

unused_data

Datos encontrados después del final de la transmisión comprimida.

Si esto attribute se accede antes de que se alcance el final de la transmisión, su valor será b''.

needs_input

False Si el decompress() El método puede proporcionar más datos descomprimidos antes de requerir una nueva entrada sin comprimir.

Nuevo en la versión 3.5.

(Des) compresión de un disparo

bz2.compress(data, compresslevel=9)

Comprimir datos, a objeto similar a bytes.

nivel de compresión, si se da, debe ser un número entero entre 1 y 9. El valor predeterminado es 9.

Para la compresión incremental, utilice un BZ2Compressor en lugar de.

bz2.decompress(data)

Descomprimir datos, a objeto similar a bytes.

Si datos es la concatenación de varios flujos comprimidos, descomprime todos los flujos.

Para la descompresión incremental, utilice un BZ2Decompressor en lugar de.

Modificado en la versión 3.3: Se agregó soporte para entradas de flujo múltiple.

Ejemplos de uso

A continuación se muestran algunos ejemplos de uso típico del bz2 módulo.

Utilizando compress() y decompress() para demostrar la compresión de ida y vuelta:

>>>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 ratio1.513595166163142>>> d = bz2.decompress(c)>>> data == d  # Check equality to original object after round-tripTrue

Utilizando BZ2Compressor para compresión incremental:

>>>import bz2
>>>defgen_data(chunks=10, chunksize=1000):..."""Yield incremental blocks of chunksize bytes."""...for _ inrange(chunks):...yieldb"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()

El ejemplo anterior utiliza un flujo de datos muy “no aleatorio” (un flujo de b”z” trozos). Los datos aleatorios tienden a comprimirse de manera deficiente, mientras que los datos repetitivos ordenados generalmente producen una alta relación de compresión.

Escribir y leer un archivo comprimido con bzip2 en modo binario:

>>>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-tripTrue