2012-03-01 29 views
12

Quiero comprimir archivos de texto grandes con python (estoy hablando de archivos de> 20 Gb). no soy ninguna cómo un experto así que traté de recopilar la información que encontré y la siguiente parece que funciona:Compresión de archivos grandes con python

import bz2 

with open('bigInputfile.txt', 'rb') as input: 
    with bz2.BZ2File('bigInputfile.txt.bz2', 'wb', compresslevel = 9) as output: 
     while True: 
      block = input.read(900000) 
       if not block: 
        break 
       output.write(block) 

input.close() 
output.close() 

Me pregunto si esta sintaxis es correcta y si hay una manera de optimizarlo? Tengo la impresión de que me falta algo aquí.

Muchas gracias.

+2

¿Cuál es el problema que está teniendo? ¿El archivo que arrojas es correcto? – Daenyth

+1

¿Por qué eligió leer por 900000? – n1r3

+0

Sí, parece que el tamaño sin comprimir corresponde y el formato se ve bien. No confío en todo lo que digo al aprender Python (y TI en general) solo. Gracias. Sí, elijo pensar en el tamaño de los fragmentos utilizados por bzip2, pensé en comprimir mejor un fragmento a la vez, ¿no? – user1242959

Respuesta

17

Su guión parece correcta, pero se puede abreviar:

from shutil import copyfileobj 

with open('bigInputfile.txt', 'rb') as input: 
    with bz2.BZ2File('bigInputfile.txt.bz2', 'wb', compresslevel=9) as output: 
     copyfileobj(input, output) 
+0

¡Gracias! ¿Entonces quieres decir que la definición de los tamaños de los fragmentos no es necesaria? – user1242959

+1

Sí. 'copyfileobj' copia en bloques de 16kB por defecto; aún puede establecer el tamaño del fragmento si lo desea agregando un tercer argumento. –

+0

Sí, pero funciona bien así como así! – user1242959

0

¿Por qué llama a los métodos .close()? No son necesarios ya que usa la instrucción with:

+0

¡No lo sabía! – user1242959

+0

explícito es mejor que implícito: http://www.python.org/dev/peps/pep-0020/ –

Cuestiones relacionadas