gzip数据"不是gzip文件",但我认为是

时间:2016-06-22 00:44:11

标签: python gzip

此:

H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/Ih7/Hu8WZXqZ101RLT/7aHe881GaL6fVrFhefPbRuj3fPvjo9zh63FTZ6tHp8jIvq1We0ivL5hE+++yjeduuHt2920zn+SJrxvQVPh9X9cVd/HI315fufqSvvWsK+9bV1dX46h433tvZ2b37e3/x/DUD2i6WTZstp7l7a3bzWx8pok+q2fXR45N5trzIn+fLi3b+1bJoX+XNqlo2in4ILZ80eX1ZTPPfe/zi9M1dAhR5e122R7ufjnce3tvff3x3oEH0C+6XvvKwk98NSY/+H/eQC6mIAQAA

...是来自Web服务的HTTP响应的gzipped主体。我想在Python脚本中解压缩这个,所以我使用了类似于以前帖子中显示的代码,例如Decompressing a gzipped payload of a packet with Python

这是我的剧本:

#!/usr/bin/env python
import logging
import gzip
import StringIO

logging.basicConfig(filename='out.log', level=logging.DEBUG)

compressed_data = 'H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/Ih7/Hu8WZXqZ101RLT/7aHe881GaL6fVrFhefPbRuj3fPvjo9zh63FTZ6tHp8jIvq1We0ivL5hE+++yjeduuHt2920zn+SJrxvQVPh9X9cVd/HI315fufqSvvWsK+9bV1dX46h433tvZ2b37e3/x/DUD2i6WTZstp7l7a3bzWx8pok+q2fXR45N5trzIn+fLi3b+1bJoX+XNqlo2in4ILZ80eX1ZTPPfe/zi9M1dAhR5e122R7ufjnce3tvff3x3oEH0C+6XvvKwk98NSY/+H/eQC6mIAQAA'

logging.debug(compressed_data)

buf = StringIO.StringIO(compressed_data)
f = gzip.GzipFile(fileobj=buf)
decompressed_data = f.read()

logging.debug(decompressed_data)

...但是当我运行它时,Python报告它不是一个gzip压缩文件。

我很确定它是,因为当我使用this online gzip/gunzip utility时,字符串被正确解压缩。 HTTP响应头也表示它是gzip编码的。而且,当我使用测试工具调用服务时,我也可以看到解码的内容。

我很想知道我在这里省略了什么。

作为参考,解压缩的字符串应为:

<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><ChangeLengthUnitResponse xmlns="http://www.webserviceX.NET/"><ChangeLengthUnitResult>16.09344</ChangeLengthUnitResult></ChangeLengthUnitResponse></soap:Body></soap:Envelope>

我正在使用Python 2.7.11。

1 个答案:

答案 0 :(得分:1)

使用@ Rhymoid的建议,您的代码看起来应该是这样的(未经测试):

#!/usr/bin/env python
import logging
import gzip 
import StringIO
from base64 import b64decode

logging.basicConfig(filename='out.log', level=logging.DEBUG)

compressed_data = 'H4sIAAAAAAAEAO29B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/Ih7/Hu8WZXqZ101RLT/7aHe881GaL6fVrFhefPbRuj3fPvjo9zh63FTZ6tHp8jIvq1We0ivL5hE+++yjeduuHt2920zn+SJrxvQVPh9X9cVd/HI315fufqSvvWsK+9bV1dX46h433tvZ2b37e3/x/DUD2i6WTZstp7l7a3bzWx8pok+q2fXR45N5trzIn+fLi3b+1bJoX+XNqlo2in4ILZ80eX1ZTPPfe/zi9M1dAhR5e122R7ufjnce3tvff3x3oEH0C+6XvvKwk98NSY/+H/eQC6mIAQAA'

logging.debug(compressed_data)

buf = StringIO.StringIO(b64decode(compressed_data))
f = gzip.GzipFile(fileobj=buf)
decompressed_data = f.read()

logging.debug(decompressed_data)

base64.b64decode方法将返回已解码的字符串。