当前位置: 首页 > 面试题库 >

Python逐块解压缩gzip

曾华翰
2023-03-14
问题内容

我有一个内存和磁盘受限的环境,我需要解压缩以字符串为基础的块(通过xmlrpc二进制传输)发送给我的gzip文件的内容。但是,使用zlib.decompress()或zlib.decompressobj()/
decompress()都可以在gzip标头上使用barf。我已经尝试过偏移gzip标头(在此处记录),但是仍然没有避免使用barf。gzip库本身似乎仅支持从文件解压缩。

以下代码段简化了我想做的事情(在现实生活中,缓冲区将从xmlrpc填充,而不是从本地文件读取):

#! /usr/bin/env python

import zlib

CHUNKSIZE=1000

d = zlib.decompressobj()

f=open('23046-8.txt.gz','rb')
buffer=f.read(CHUNKSIZE)

while buffer:
  outstr = d.decompress(buffer)
  print(outstr)
  buffer=f.read(CHUNKSIZE)

outstr = d.flush()
print(outstr)

f.close()

不幸的是,正如我说的那样,此选项带有:

Traceback (most recent call last):
  File "./test.py", line 13, in <module>
    outstr = d.decompress(buffer)
zlib.error: Error -3 while decompressing: incorrect header check

从理论上讲,我可以将来自xmlrpc的数据馈入StringIO,然后将其用作gzip.GzipFile()的fileobj,但是,在现实生活中,我也没有可用的内存来将整个文件内容保存在内存中作为解压缩的数据。我确实确实需要逐块处理它。

退路是将我的xmlrpc数据压缩从gzip更改为纯zlib,但是由于这会影响其他子系统,因此我希望尽可能避免这种情况。

有任何想法吗?


问题答案:

gzip和zlib使用略有不同的标头。

尝试d = zlib.decompressobj(16+zlib.MAX_WBITS)

并且CHUNKSIZE=1024出于可能的性能原因,您可以尝试将块大小更改为2的幂(例如)。



 类似资料:
  • 使用的字符串: string='hello'+'\r\n'+'world' Java中的预期输出: out.getValue() f.write(Base64.b64Encode(Out.getValue())) F.Close() ByteArrayInputStream(压缩)); InputStreamReader(gis,“UTF-8”));

  • tar [-]c|x|u|r|t[z|j][v] -f 归档文件 [待打包文件] 将多个文件打包为一个归档文件,可以在打包的同时进行压缩。支持的格式为 tar(归档)、gz(压缩)、bz2(压缩率更高,比较耗时) 操作选项 -c 创建 -x 解包 -u 更新 -r 添加 -t 查看 -d 比较压缩包内文件和文件 -A 将 tar 文件添加到归档文件中 格式选项 -z 使用 gz 压缩格式 -j 使

  • 本文向大家介绍详解Python 解压缩文件,包括了详解Python 解压缩文件的使用技巧和注意事项,需要的朋友参考一下 zipfile模块及相关方法介绍: 1 压缩 1.1 创建zipfile对象 zipfile.ZipFile(file, mode='r', compression=0, allowZip64=True, compresslevel=None) 创建Zipfile对象,主要参数:

  • 问题内容: 情况如下: 我从Amazon S3获取gzip压缩的xml文档 我以文件形式阅读它们 题 如何直接解压缩流并读取内容? 我不想创建临时文件,它们看起来不太好。 问题答案: 是的,您可以使用该模块解压缩字节流: 到标头的32个偏移量表示gzip标头是预期的但已跳过。 S3键对象是一个迭代器,因此您可以执行以下操作:

  • 问题内容: 我知道这是一项容易的任务,但是更改代码后它停止工作,并且无法恢复!我实际上使用了两个函数来进行压缩和解压缩,尽管实际上它是“ jar”和“ unjar”,但这并没有太大的区别 任何帮助/建议吗? 创建JarFile时发生错误: 问题答案: 我不知道这是否是您的问题,但是通常最好在完成写入后关闭每个zip条目。 请参阅。 在显示的代码中,不会关闭邮政编码中的最后一个条目。您也不会显示关闭

  • 问题内容: 我正在使用php的功能来执行HTTP请求。为了节省带宽,我决定使用添加标题。 显然,输出一个gzip编码的字符串,所以我用来解码该编码的字符串,但是将作为参数传递的数据出错。 我知道还有另一个功能可以解压缩压缩后的数据,但是它不包含在我的PHP版本中(也许仅在SVN上可用)。 我知道cUrl可以即时解码gzip流(没有任何问题),但是有人建议我使用它而不是cUrl。 您是否知道以其他方