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 yBZ2File
clase para leer y escribir archivos comprimidos. - los
BZ2Compressor
yBZ2Decompressor
clases para la (des) compresión incremental. - los
compress()
ydecompress()
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 (unstr
obytes
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 unio.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
obytes
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 entre1
y9
especificando el nivel de compresión:1
produce la menor compresión, y9
(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 elio.BufferedIOBase
, excepto pordetach()
ytruncate()
. Iteración y lawith
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 delBZ2File
, puede cambiar la posición del objeto de archivo subyacente (por ejemplo, si elBZ2File
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()
yreadinto()
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 deNone
.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
y9
. El valor predeterminado es9
.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()
yBZ2File
. Si necesita descomprimir una entrada de flujo múltiple conBZ2Decompressor
, 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 adecompress()
.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á enFalse
. En este caso, la próxima llamada adecompress()
podría proveer datos comob''
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á enTrue
.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 elunused_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 eldecompress()
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
y9
. El valor predeterminado es9
.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
valoraciones y reseñas
Recuerda algo, que tienes la capacidad de decir si atinaste tu cuestión a tiempo.