圧縮ファイル (gzip または bzip2 のいずれか) をダウンロードし、それを解凍してその内容を分析したい (これは大量のデータを含む CSV のようなファイルで、特定の列の合計、平均などを計算します) (ダウンロードが終了する前に部分的な結果を表示できるようにするため)。ファイルは大きく (4GB)、解凍されたストリームはさらに大きいため、圧縮ファイル全体をディスクまたはメモリに保持したくありません。
Python の gzip または bz2 実装を urllib2 と組み合わせることが可能になると思いました。
data_stream = csv.reader(
gzip.GzipFile(
fileobj=urllib2.urlopen('http://…/somefile.gz')),
delimiter='\t')
…しかし、urlopen のファイルは、GzipFile に対して十分なファイルライクではないようです。そのようなストリームから読み取ろうとすると、トレースバックが表示されます。
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/gzip.py", line 450, in readline
c = self.read(readsize)
File "/usr/lib/python2.7/gzip.py", line 256, in read
self._read(readsize)
File "/usr/lib/python2.7/gzip.py", line 283, in _read
pos = self.fileobj.tell() # Save current position
AttributeError: addinfourl instance has no attribute 'tell'
BZ2 モジュールはさらに悪く、ファイル オブジェクトを渡すことはまったくできません。
いくつかの答えを探した後、私はこの質問を見つけました。答えは、基本的に圧縮ファイル全体をメモリに保存することで機能しますが、これは私には実行不可能です。
私に何ができる?