2012-07-14 21 views
16

Estoy tratando de usar el módulo zipfile para leer un archivo en un archivo. el archivo descomprimido es ~ 3GB y el archivo comprimido es 200MB. No los quiero en la memoria mientras proceso el archivo comprimido línea por línea. Hasta ahora me he dado cuenta de un uso excesivo de memoria usando el siguiente código:Lea un archivo grande de texto comprimido línea por línea en python

import zipfile 
f = open(...) 
z = zipfile.ZipFile(f) 
for line in zipfile.open(...).readlines() 
    print line 

lo hice en C# usando el SharpZipLib:

var fStream = File.OpenRead("..."); 
var unzipper = new ICSharpCode.SharpZipLib.Zip.ZipFile(fStream); 
var dataStream = unzipper.GetInputStream(0); 

corriente de datos es sin comprimir. Parece que no puedo encontrar la forma de hacerlo en Python. La ayuda será apreciada.

Respuesta

38

Los objetos de archivos Python proporcionan iteradores, que leerán línea por línea. file.readlines() los lee todos y devuelve una lista, lo que significa que debe leer todo en la memoria. El mejor enfoque (que siempre debe ser preferido sobre readlines()) es simplemente un bucle sobre el objeto en sí, Ej:

import zipfile 
with zipfile.ZipFile(...) as z: 
    with z.open(...) as f: 
     for line in f: 
      print line 

Nota mi uso de the with statement - objetos de archivo son gestores de contexto, y la sentencia with nos deja escribir con facilidad código legible que asegura que los archivos se cierran cuando se cierra el bloque (incluso con excepciones). Esto, de nuevo, siempre se debe usar cuando se trata de archivos.

+0

no podría decir mejor que eso –

Cuestiones relacionadas