【问题标题】:Python 3.7 zlib decompressed size is smaller than compressedPython 3.7 zlib 解压后的大小小于压缩后的大小
【发布时间】:2019-01-12 22:00:10
【问题描述】:

我写了一个小的python代码,它应该解压一个~180Mb的大二进制文件。问题是它只能解压缩大约 50Mb。 我想知道是否有人以前遇到过类似的奇怪问题,并找到了解决方案。

import zlib, sys
text = open('REG_E.rzp','rb').read()
print(sys.getsizeof(text))
# 187424785


decompressed = zlib.decompress(text)
print(sys.getsizeof(decompressed))
# 50001

附加信息:第一个解压缩的 50Mbytes 是正确的,并且可以在十六进制编辑器中读取。所以我想知道,一次可以解压缩多少 zlib 是否有限制?我没有收到任何错误消息,所以我对此一无所知。

【问题讨论】:

  • 我怀疑文件已损坏。你能用普通的命令行工具(不是python)解压它吗?它仍然解压到 50Mb 吗?
  • 你知道它使用的是哪种压缩格式吗?最初使用哪个程序来创建存档?

标签: python-3.x zlib


【解决方案1】:

您似乎没有正确关闭文件,因此文件可能未完全写入:

import zlib, sys
with open('REG_E.rzp','rb') as f:
    text = f.read()
    print(sys.getsizeof(text))

decompressed = zlib.decompress(text)
print(sys.getsizeof(decompressed))

with open('cecomp.bin','wb') as f:
    f.write(decompressed)

recomp = zlib.compress(decompressed)
print(sys.getsizeof(recomp))
with open('recomp.bin','wb') as f:
    f.write(recomp)

添加with 块可确保您关闭文件(这也确保您真正完成写入磁盘)。

【讨论】:

  • 文件关闭似乎不是这里的问题。
【解决方案2】:

从文件扩展名来看,它可能是用rzip 压缩的,而不是gzip。 Rzip 使用 bzip2,而不是 zlib 的 DEFLATE。 Python 的 zlib 模块可能无法读取该格式。

【讨论】:

    【解决方案3】:

    问题已解决。存档由多个压缩文件组成,必须逐个文件解压缩。

    【讨论】:

      最近更新 更多