V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
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 ·
    lyhyl · 2020-11-05 01:00:13 +08:00 · 1932 次点击
    这是一个创建于 1483 天前的主题,其中的信息可能已经有所发展或是发生改变。

    代码如下:

    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 条回复    2020-11-05 17:52:52 +08:00
    lcdtyph
        1
    lcdtyph  
       2020-11-05 01:10:11 +08:00   ❤️ 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
       2020-11-05 01:22:08 +08:00
    @lcdtyph 感谢,因为有个文件直接`zlib.compress`会报错,但是`zlib.decmpressobj().decompress()`却不会,才搞的这种写法。这问题也 Google 不到,大半夜还搞得焦头烂额的。不知道你知道有什么区别吗?
    wingkou
        3
    wingkou  
    OP
       2020-11-05 01:24:05 +08:00
    @lcdtyph 上面打快了,应该是`zlib.decompress()`会报错,但是`zlib.decmpressobj().decompress()`却不会。
    owtotwo
        4
    owtotwo  
       2020-11-05 17:52:52 +08:00
    建议把报错的 minimum 文件样例也列出来,不然不好复现
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5472 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 08:55 · PVG 16:55 · LAX 00:55 · JFK 03:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.