28

zipfile モジュールを使用してアーカイブ内のファイルを読み取ろうとしています。非圧縮ファイルは約 3GB、圧縮ファイルは 200MB です。圧縮ファイルを1行ずつ処理するので、それらをメモリに入れたくありません。これまでのところ、次のコードを使用してメモリが過剰に使用されていることに気付きました。

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);

dataStream は圧縮されていません。Pythonでそれを行う方法が見つからないようです。助けていただければ幸いです。

4

1 に答える 1

72

Python ファイル オブジェクトは、1 行ずつ読み取る反復子を提供します。file.readlines()それらをすべて読み取り、リストを返します。つまり、すべてをメモリに読み取る必要があります。より良いアプローチ (これは常に より優先されるべきreadlines()です) は、オブジェクト自体を単にループすることです。例:

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

ファイル オブジェクトはコンテキスト マネージャーであり、 withステートメントを使用するwithと、ブロックが終了したときに (例外が発生した場合でも) ファイルが確実に閉じられるようにする読み取り可能なコードを簡単に記述できます。これも、ファイルを扱うときは常に使用する必要があります。

于 2012-07-14T08:50:15.013 に答える