2012-07-14 12 views
16

アーカイブ内のファイルを読み込むためにzipfileモジュールを使用しようとしています。非圧縮ファイルは〜3GB、圧縮ファイルは200MBです。圧縮されたファイルを1行ずつ処理するので、私はそれらをメモリに入れたくありません。これまでのところ私は、次のコードを使用して、メモリの使いすぎに気づいた:Pythonで行ごとに大きなzip形式のテキストファイルを読む

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ファイルオブジェクトはイテレータを提供します。イテレータは1行ずつ読み込みます。 file.readlines()はそれらをすべて読み取り、リストを返します。つまり、すべてをメモリに読み込む必要があります。 (常にreadlines()より優先されなければならない)、より良いアプローチは、オブジェクト自体の上にちょうどループに例:次のとおりです。

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

the with statementの私の使用に注意してください - ファイルオブジェクトは、コンテキストマネージャであり、ステートメントを使用して、私たちは簡単に書くことができますブロックが終了したときに(たとえ例外があっても)ファイルが閉じられることを保証する可読コード。これは、ファイルを扱う際に常に使用するべきです。

+0

これ以上は言えませんでした –

関連する問題