Jython 2.2.1如何解压缩gzip流?

时间:2012-05-18 18:05:05

标签: stream streaming gzip jython zlib

我坚持使用Jython 2.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

显然the header offset trick不适用于zlib的旧版本。

我是Jython的Java方面的新手,并且想知道是否有办法在Jython中使用Java类解压缩gzip流?或许有一种方法可以诱使zlib 1.1.3接受gzip标头?

欢迎任何其他潜在的解决方案。

2 个答案:

答案 0 :(得分:0)

没有办法将这些对zlib 1.1.3的调用用于解码gzip头。该功能已在zlib 1.2.0中添加。

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

答案 1 :(得分: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