0

プロジェクトでJython2.2.1とzlibモジュールバージョン1.1.3を使用し続けています。大量のgzip圧縮されたデータをダウンロードして処理し、データベースに書き込む必要があります。データの複数のコピーがメモリに存在しないようにしたいので、ストリームとして解凍しています。

Python 2.7.2を使用して、gzipストリームを次のように解凍することができました。

from zlib import decompressobj, MAX_WBITS

f = open('stream.gz', 'rb') # in real life, this stream comes from urllib2  
gunzipper = decompressobj(16+MAX_WBITS)  
data = ''  
for chunk in iter(lambda: f.read(BLOCK_SIZE), ''):
    data += gunzipper.decompress(chunk)
#done

ただし、Jython 2.2.1では、decompressobj:を作成するときに同じコードでエラーが発生します。

.\jythonLib.jar\lib/zlib$py.class", line 89, in __init__
ValueError: Invalid initialization option

どうやら、ヘッダーオフセットトリックはこの古いバージョンのでは機能しませんzlib

私はJythonのJava側に不慣れで、Jython内のJavaクラスを使用してgzipストリームを解凍する方法があるかどうか疑問に思っていましたか?zlib 1.1.3または、gzipヘッダーを受け入れるように誘導する方法はありますか?

他の潜在的な解決策は大歓迎です。

4

2 に答える 2

0

Jython 内に統合された Java ライブラリを使用することで、この古い zlib モジュールを回避することができました。

FileInputStreamオブジェクトを gzip デコーダーに渡すために、Java クラスを使用して URL を処理する必要もありました。

今後の参考のために:

from java.io import BufferedReader,InputStreamReader
from java.util.zip import GZIPInputStream
from java.net import URL

url = URL('http://data.com')
urlconn = url.openConnection()
urlconn.setRequestProperty('Accept-encoding', 'gzip, compress')
urlconn.connect()

reader = BufferedReader(InputStreamReader(GZIPInputStream(urlconn.getInputStream())))
data = ''
for chunk in iter(lamdba: reader.readLine(), None):
    data += chunk
于 2012-05-21T14:50:10.340 に答える
0

これらの zlib 1.1.3 への呼び出しを誘導して gzip ヘッダーをデコードする方法はありません。その機能は zlib 1.2.0 で追加されました。

-MAX_WBITSまたは、gzip ラッパーを自分でデコードし、圧縮されたペイロードのパラメーターとしてraw inflate を呼び出すこともできます。RFC 1952で定義されている gzip ラッパーを見つけることができます。

于 2012-05-19T06:19:10.953 に答える