我有一个gzip文件,我试图通过Python读取它,如下所示:
import zlib
do = zlib.decompressobj(16+zlib.MAX_WBITS)
fh = open('abc.gz', 'rb')
cdata = fh.read()
fh.close()
data = do.decompress(cdata)
Run Code Online (Sandbox Code Playgroud)
它会抛出此错误:
zlib.error: Error -3 while decompressing: incorrect header check
Run Code Online (Sandbox Code Playgroud)
我怎么能克服它?
我试图提取一个压缩文件夹,但不是直接使用.extractall(),我想将文件解压缩为流,以便我可以自己处理流.是否可以使用它tarfile?或者有什么建议吗?
我正在尝试读取我通过请求请求的gzip XML文件.我读过的所有内容都表明解压缩应该自动发生.
#!/usr/bin/python
from __future__ import unicode_literals
import requests
if __name__ == '__main__':
url = 'http://rdf.dmoz.org/rdf/content.rdf.u8.gz'
headers = {
'Accept-Encoding': "gzip,x-gzip,deflate,sdch,compress",
'Accept-Content': 'gzip',
'HTTP-Connection': 'keep-alive',
'Accept-Language': "en-US,en;q=0.8",
}
request_reply = requests.get(url, headers=headers)
print request_reply.headers
request_reply.encoding = 'utf-8'
print request_reply.text[:200]
print request_reply.content[:200]
Run Code Online (Sandbox Code Playgroud)
我的第一行输出中的标题如下所示:
{'content-length': '260071268', 'accept-ranges': 'bytes', 'keep-alive': 'timeout=5, max=100', 'server': 'Apache', 'connection': 'Keep-Alive', 'date': 'Tue, 08 Sep 2015 16:27:49 GMT', 'content-type': 'application/x-gzip'}
Run Code Online (Sandbox Code Playgroud)
接下来的两个输出行似乎是二进制的,我期待XML文本:
?I?(?????~?ool???u?r??J???io? a2R1???|?<????_??????????=?Z????onnz7?{JO???}h?????6??·??>,a?>??hZ6?u??x????y?_?.y?$??
?I?(?????~?ool???u?r??J???io? a2R1???|?<????_??????????=?Z????onnz7?{JO??}h?????6??·??>,a?>??hZ6?u??x???
Run Code Online (Sandbox Code Playgroud)
我认为部分问题是site-packages/requests/packages/urllib3/response.py除非标题有,否则无法识别gzip'content-encoding': 'gzip'
我能够通过在方法中添加4行来获得我想要的结果response.py:
def _init_decoder(self):
"""
Set-up the …Run Code Online (Sandbox Code Playgroud) 我有一个从库调用读取的字节缓冲区,我想解压缩单个文本文件的内容.
我试过了zlib,但是我收到了这个错误:
>>> import zlib
>>> zlib.decompress(buffer)
error: Error -3 while decompressing data: incorrect header check
Run Code Online (Sandbox Code Playgroud)
但ZipFile它有效,但我必须使用临时文件:
import zipfile
f = open('foo.zip', 'wb')
f.write(buffer)
f.close()
z = ZipFile('foo.zip')
z.extractall()
z.close()
with open('foo.txt', 'r') as f:
uncompressed_buffer = f.read()
Run Code Online (Sandbox Code Playgroud)
是否可以使用zlib,如何避免使用临时文件?
给定gzipS3 中的一个大对象,python3/boto3 中用于解压缩数据并将结果存储回另一个 S3 对象的内存高效(例如流)方法是什么?
之前有一个类似的问题。但是,所有答案都使用一种方法,其中 gzip 文件的内容首先读入内存(例如ByteIO)。对于太大而无法放入主内存的对象,这些解决方案是不可行的。
对于大型 S3 对象,内容需要被读取、“动态”解压缩,然后写入不同的 S3 对象是某种分块方式。
预先感谢您的考虑和回应。