我坚持使用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标头?
欢迎任何其他潜在的解决方案。
答案 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