8

非常に大きなzipファイルがあり、分割アーカイブとして複数の部分に分割されており、アーカイブ内に1つのファイルがあります。これらのアーカイブを結合したり抽出したりするのに十分なリソースがありません(生のテキストファイルはほぼ1TBです)。

理想的には次のようなものを使用して、テキストファイルを1行ずつ解析したいと思います。

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

これは可能ですか?もしそうなら、どうすればテキストファイルを読むことができますか?

  1. あまり多くのメモリを使用せずに(ファイル全体をメモリにロードすることは明らかに問題外です)
  2. zipファイルを抽出せずに
  3. (理想的には)zipファイルを結合せずに

よろしくお願いします。

4

1 に答える 1

3

刺します。

zipファイルがZipファイル形式によるいわゆる「分割アーカイブ」である場合、Pythonのzipファイルライブラリでもunzipターミナルコマンドでもそれらを読み取ることはできません。

一方、splitコマンドまたは同様のバイト分割デバイスを使用して分割された単一のzipアーカイブを処理している場合は、Pythonでその内容をその場で抽出して読み取ることができる場合があります。

seek()メソッドとread()メソッド(および場合によっては他のメソッド)を受け入れ、分割されたチャンクでそれらを実行する「ファイルのような」カスタムクラスを作成する必要があります。

seek()は、読み取るzipファイルを計算して開き(現在のファイルがまだ開いていない場合)、オフセットの差を使用してそのzipファイルに対してseek()を実行する必要があります。

read()は、現在開いているチャンクから読み取り、ファイルの終わりの状態を処理します。これにより、次のチャンクが開かれ、読み取りが完了します。

このクラスを作成してテストした後は、ZipFileコンストラクターを呼び出して、クラスのインスタンスを「仮想zip」ファイルオブジェクトとして渡して開きます。

于 2013-03-13T19:53:33.847 に答える