【问题标题】:Convert from '_io.BytesIO' to a bytes-like object in python3.6?在 python3.6 中从“_io.BytesIO”转换为类似字节的对象?
【发布时间】:2019-06-05 20:38:57
【问题描述】:

如果使用 gzip、compress 或 deflate 压缩正文或 HTTP 响应,我正在使用此函数解压缩。

def uncompress_body(self, compression_type, body):
    if compression_type == 'gzip' or compression_type == 'compress':
        return zlib.decompress(body)
    elif compression_type == 'deflate':
        compressor = zlib.compressobj(9, zlib.DEFLATED, -zlib.MAX_WBITS)
        compressed = compressor.compress(body)
        compressed += compressor.flush()
        return base64.b64encode(compressed)

    return body

然而python抛出了这个错误信息。

TypeError: a bytes-like object is required, not '_io.BytesIO'

在这一行:

return zlib.decompress(body)

本质上,我如何从 '_io.BytesIO' 转换为类似字节的对象?

【问题讨论】:

    标签: python python-3.x typeerror zlib bytesio


    【解决方案1】:

    这是一个类似文件的对象。阅读它们:

    >>> b = io.BytesIO(b'hello')
    >>> b.read()
    b'hello'
    

    如果来自body 的数据太大而无法读入内存,您需要重构代码并使用zlib.decompressobj 而不是zlib.decompress。

    【讨论】:

    • 当您考虑基本解决方案时:D
    【解决方案2】:

    如果您先写入对象,请确保在读取之前重置流:

    >>> b = io.BytesIO()
    >>> image = PIL.Image.open(path_to_image)
    >>> image.save(b, format='PNG')
    >>> b.seek(0)
    >>> b.read()
    b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x06\xcf\x00\x00\x03W\x08\x02\x00'
    

    或者直接用getvalue获取数据

    >>> b.getvalue()
    b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x06\xcf\x00\x00\x03W\x08\x02\x00'
    

    【讨论】:

      猜你喜欢
      • 2018-02-14
      • 2021-05-13
      • 2019-02-04
      • 1970-01-01
      • 2021-02-23
      • 1970-01-01
      • 2019-09-07
      • 2021-08-17
      • 1970-01-01
      相关资源
      最近更新 更多