2011-11-16 12 views
21

Quiero gzip un archivo en Python. Estoy tratando de usar subprocss.check_call(), pero sigue fallando con el error 'OSError: [Errno 2] No such such file or directory'. ¿Hay algún problema con lo que intento aquí? ¿Hay una mejor manera de descomprimir un archivo que usar subprocess.check_call?GZIP un archivo en Python

from subprocess import check_call 

def gZipFile(fullFilePath) 
    check_call('gzip ' + fullFilePath) 

Thanks !!

+11

¿Por qué no http://docs.python.org/library/gzip.html? – Ski

+0

relacionado: para crear un tarball comprimido 'archive.tar.gz' desde un directorio'/dir/path', puede usar 'shutil.make_archive ('archive', 'gztar', '/ dir/path')' – jfs

Respuesta

13

Prueba esto:

check_call(['gzip', fullFilePath]) 

Dependiendo de lo que está haciendo con los datos de estos archivos, enlace de Skirmantas a http://docs.python.org/library/gzip.html también puede ser útil. Tenga en cuenta los ejemplos cerca de la parte inferior de la página. Si no necesita acceder a los datos, o si ya no tiene los datos en su código de Python, ejecutar gzip puede ser la forma más limpia de hacerlo, por lo que no tiene que manejar los datos en Python.

+0

bueno, idk si "limpio" es la palabra correcta, pero ciertamente es la manera más rápida, y la que necesita menos código de su lado. –

46

hay un módulo gzip. Uso:

Ejemplo de cómo crear un archivo GZIP comprimido:

import gzip 
content = "Lots of content here" 
f = gzip.open('/home/joe/file.txt.gz', 'wb') 
f.write(content) 
f.close() 

Ejemplo de cómo GZIP comprimir un archivo existente:

import gzip 
f_in = open('/home/joe/file.txt') 
f_out = gzip.open('/home/joe/file.txt.gz', 'wb') 
f_out.writelines(f_in) 
f_out.close() 
f_in.close() 

EDIT:

Jace Browning's answer usando with en Python> = 2.7 es obviamente más escueto y legible, por lo que mi segundo fragmento sería (y sh Uld) se parece a:

import gzip 
with open('/home/joe/file.txt') as f_in, gzip.open('/home/joe/file.txt.gz', 'wb') as f_out: 
    f_out.writelines(f_in) 
+0

¿la segunda versión reemplaza el archivo original con el gzip, como lo haría el comando gzip? Parece que no. –

+1

@ Benoît: dado que el archivo de salida tiene un nombre diferente al que se está leyendo, es bastante obvio que no lo hace. Hacerlo requeriría que los datos comprimidos se almacenaran temporalmente en otro lugar hasta que todos los datos en el archivo original se hubieran comprimido. – martineau

+0

Usando gzip, el nombre de archivo de salida es diferente del nombre de archivo de entrada. Y aún elimina el archivo de entrada después de haber creado el de salida. Simplemente estaba preguntando si el módulo python gzip hizo lo mismo. –

5

utilizar el módulo gzip:

import gzip 
import os 

in_file = "somefile.data" 
in_data = open(in_file, "rb").read() 
out_gz = "foo.gz" 
gzf = gzip.open(out_gz, "wb") 
gzf.write(in_data) 
gzf.close() 

# If you want to delete the original file after the gzip is done: 
os.unlink(in_file) 

Su error: OSError: [Errno 2] No such file or directory' le está diciendo que el archivo fullFilePath no existe. Si aún necesita seguir esa ruta, asegúrese de que el archivo exista en su sistema y esté utilizando una ruta absoluta no relativa.

+0

Gracias a todos por los rapidos repondedores. Todos aquí están sugiriendo gzip. Lo he intentado también. ¿Es una mejor manera? La razón por la que no estoy usando eso es que deja el archivo original como está. Así que termino con ambas versiones: archivo regular y gzip. Sin embargo, estoy accediendo a los datos del archivo. @retracile, tu corrección funcionó, muchas gracias. Todavía me pregunto si debería usar un subproceso o gzip. – Rinks

+1

@Rinks La manera más fácil de hacerlo sería: Cuando el gzip finalice, llame a 'os.unlink (original_File_Name)' para eliminar el archivo original desde el que creó el gzip. Ver mis ediciones – chown

+1

@Rinks: _La razón por la que no estoy usando eso es que deja el archivo original como está_ - ¿por qué no elimina el archivo después? – Xaerxess

28

En Python 2.7 Formato:

import gzip 

with open("path/to/file", 'rb') as orig_file: 
    with gzip.open("path/to/file.gz", 'wb') as zipped_file: 
     zipped_file.writelines(orig_file) 

aún más corto (probado en Python 2.7.6)

with open('path/to/file') as src, gzip.open('path/to/file.gz', 'wb') as dst:   
    dst.writelines(src) 
3

la documentación sobre esto es en realidad increíblemente sencillo

Ejemplo de cómo leer un archivo comprimido:

import gzip 
f = gzip.open('file.txt.gz', 'rb') 
file_content = f.read() 
f.close() 

Ejemplo de cómo crear un archivo comprimido con gzip:

import gzip 
content = "Lots of content here" 
f = gzip.open('file.txt.gz', 'wb') 
f.write(content) 
f.close() 

Ejemplo de cómo comprimir un archivo existente GZIP:

import gzip 
f_in = open('file.txt', 'rb') 
f_out = gzip.open('file.txt.gz', 'wb') 
f_out.writelines(f_in) 
f_out.close() 
f_in.close() 

https://docs.python.org/2/library/gzip.html

Esa es toda la documentación. . .

Cuestiones relacionadas