Как мне преобразовать из _io.BytesIO в байтовоподобный объект в python3.6?

Я использую эту функцию, чтобы распаковать тело или HTTP-ответ, если он сжат с помощью gzip, compress или deflate.

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 в байтовоподобный объект?

Спасибо

4 ответа

Решение

Это файловый объект. Читать их:

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

Если данные поступают из body слишком велик для чтения в память, вам нужно реорганизовать код и использовать zlib.decompressobj вместо zlib.decompress,

Если вы сначала записываете в объект, не забудьте сбросить поток перед чтением:

>>> 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'
      b = io.BytesIO()
image = PIL.Image.open(path_to_image) # ie 'image.png'
image.save(b, format='PNG')
b.getbuffer().tobytes() # b'\x89PNG\r\n\x1a\n\x00 ...

Я знаю, что уже поздно отвечать, но если кто-то столкнется с той же проблемой, то приведенный ниже фрагмент кода может быть полезен.

      from io import BytesIO


data = BytesIO(b'Some data')

bytes_data = data.getvalue()

print(bytes_data, type(bytes_data)

Выход

      b'Some data' <class 'bytes'>
Другие вопросы по тегам