2012-07-14 10 views
16

Sto provando ad usare il modulo zipfile per leggere un file in un archivio. il file non compresso è ~ 3 GB e il file compresso è 200 MB. Non li voglio in memoria mentre elaboro il file compresso riga per riga. Finora ho notato un uso eccessivo della memoria utilizzando il seguente codice:Leggere un grande file di testo con zip riga per riga in python

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

ho fatto in C# utilizzando lo SharpZipLib:

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

Datastream è compresso. Non riesco a trovare un modo per farlo in Python. L'aiuto sarà apprezzato.

risposta

38

Gli oggetti file Python forniscono iteratori, che vengono letti riga per riga. file.readlines() li legge tutti e restituisce una lista, il che significa che è necessario leggere tutto in memoria. L'approccio migliore (che dovrebbe sempre essere preferito su readlines()) è di poco ciclo su l'oggetto stesso, ad esempio:

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

noti il ​​mio uso di the with statement - oggetti file sono gestori di contesto, e l'istruzione with ci permette di scrivere facilmente codice leggibile che assicura che i file siano chiusi quando il blocco viene chiuso (anche in caso di eccezioni). Questo, ancora, dovrebbe sempre essere usato quando si tratta di file.

+0

non si può dire meglio di quello –

Problemi correlati