0

我被困zlib在一个项目中使用带有模块版本 1.1.3 的 Jython 2.2.1。我需要下载大量压缩数据,对其进行处理,然后将其写入数据库。我想避免在内存中有多个数据副本,所以我将其解压缩为流。

使用 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

没有办法哄骗那些对 zlib 1.1.3 的调用来解码 gzip 标头。该功能是在 zlib 1.2.0 中添加的。

您也可以自己解码 gzip 包装器,然后调用 raw inflate with-MAX_WBITS作为压缩负载的参数。您可以找到RFC 1952中定义的 gzip 包装器。

于 2012-05-19T06:19:10.953 回答
0

通过使用 Jython 中的集成 Java 库,我能够使用这个旧的 zlib 模块。

我还必须使用 Java 类处理我的 URL,以便将FileInputStream对象传递给 gzip 解码器。

备查:

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 回答