Python

2012-07-14 10 views
16

Satırda büyük, sıkıştırılmış metin dosyası satırını oku Arşivdeki bir dosyayı okumak için zipfile modülünü kullanmaya çalışıyorum. sıkıştırılmamış dosya ~ 3GB ve sıkıştırılmış dosya 200MB'dir. Sıkıştırılmış dosya satırını satırda işlediğim için bellekte istemiyorum. Şimdiye kadar aşağıdaki kodu kullanarak bir bellek aşırı kullanımı fark etmiş:Python

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

Ben SharpZipLib kullanarak C# yaptım:

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

veri akışını sıkıştırılmamış olduğunu. Python'da yapmanın bir yolunu bulamıyorum. Yardım takdir edilecektir.

cevap

38

Python dosya nesneleri, satır satır okuyacak olan yineleyiciler sağlar. file.readlines() hepsini okur ve bir liste döndürür - bu da her şeyi belleğe okuması gerektiği anlamına gelir. dosya nesneleri bağlam yöneticileri ve ifadeye bize kolayca yazma sağlar -

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

the with statement benim kullanımını Not: (daima readlines() tercih edilmelidir) daha iyi bir yaklaşım, nesnenin kendisi üzerinde sadece döngü için Örn olduğunu bloktan çıkıldığında dosyaların (yani istisnalara rağmen) kapalı olmasını sağlayan okunabilir kod. Bu, yine, dosyalar ile uğraşırken daima kullanılmalıdır.

+0

bundan daha iyi diyemezdi –