2012-07-14 245 views
16

大壓縮文本文件,行,我試圖用zip文件模塊讀取文件中的檔案。未壓縮文件爲〜3GB,壓縮文件爲200MB。我不希望他們在內存中,因爲我一行一行地處理壓縮文件。到目前爲止,我已經使用下面的代碼注意到一個內存過度使用:讀取線蟒蛇

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

我使用SharpZipLib做到了在C#:

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

數據流被壓縮。我似乎無法找到一種方法來在Python中完成它。幫助將不勝感激。

回答

38

的Python文件對象提供迭代器,將由線讀取線。 file.readlines()將它們全部讀取並返回一個列表 - 這意味着它需要將所有內容讀入內存。更好的辦法(應始終優先於readlines())是剛剛超過對象自身循環,例如:

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

注意我用的the with statement - 文件對象是上下文管理者和with語句讓我們隨便寫可讀代碼確保文件在退出塊時關閉(即使出現異常)。在處理文件時,應該始終使用這一點。

+0

不能說比這更好的 – 2012-07-14 08:55:32