推荐学习书目
› Learn Python the Hard Way
Python Sites
› PyPI - Python Package Index
› http://diveintopython.org/toc/index.html
› Pocoo
值得关注的项目
› PyPy
› Celery
› Jinja2
› Read the Docs
› gevent
› pyenv
› virtualenv
› Stackless Python
› Beautiful Soup
› 结巴中文分词
› Green Unicorn
› Sentry
› Shovel
› Pyflakes
› pytest
Python 编程
› pep8 Checker
Styles
› PEP 8
› Google Python Style Guide
› Code Style from The Hitchhiker's Guide
wingkou
V2EX  ›  Python

zlib compress 后 decompress 得不到原来的内容( Python 3.8)

  •  
  •   wingkou · Nov 5, 2020 · 2922 views
    This topic created in 2155 days ago, the information mentioned may be changed or developed.

    代码如下:

    import zlib
    str1 = "1234567890"
    data1 = str1.encode()
    print(len(data1), data1.decode())
    data2 = zlib.compressobj().compress(data1)
    data3 = zlib.decompressobj().decompress(data2)
    str2 = data3.decode()
    print(len(str2), str2)
    

    我这里输出的是:

    10 1234567890
    0
    

    为什么会这样的呢?

    4 replies  •  2020-11-05 17:52:52 +08:00
    lcdtyph
        1
    lcdtyph  
       Nov 5, 2020   ❤️ 1
    (de)compressobj()返回的对象是有状态的,主要用来处理流数据,在输入结束之后要调用 obj.flush() 来接收最后一段输出

    如果是一次性压缩解压可以直接调用 zlib.compress 。如果一定要用(de)compressobj 可以这样:
    cobj = zlib.compressobj()
    dobj = zlib.decmpressobj()

    data2 = cobj.compress(data1)
    data2 += cobj.flush()

    data3 = dobj.decompress(data2)
    data3 += dobj.flush()
    wingkou
        2
    wingkou  
    OP
       Nov 5, 2020
    @lcdtyph 感谢,因为有个文件直接`zlib.compress`会报错,但是`zlib.decmpressobj().decompress()`却不会,才搞的这种写法。这问题也 Google 不到,大半夜还搞得焦头烂额的。不知道你知道有什么区别吗?
    wingkou
        3
    wingkou  
    OP
       Nov 5, 2020
    @lcdtyph 上面打快了,应该是`zlib.decompress()`会报错,但是`zlib.decmpressobj().decompress()`却不会。
    owtotwo
        4
    owtotwo  
       Nov 5, 2020
    建议把报错的 minimum 文件样例也列出来,不然不好复现
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2542 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 12:03 · PVG 20:03 · LAX 05:03 · JFK 08:03
    ♥ Do have faith in what you're doing.