webentwicklung-frage-antwort-db.com.de

Wie konvertiere ich von '_io.BytesIO' in ein byteähnliches Objekt in Python3.6?

Ich verwende diese Funktion, um den Body oder eine HTTP-Antwort zu dekomprimieren, wenn sie mit gzip komprimiert, komprimiert oder entleert wird.

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

Jedoch python löst diese Fehlermeldung aus.

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

in dieser Zeile:

return zlib.decompress(body)

Wie konvertiere ich im Wesentlichen von '_io.BytesIO' in ein byteähnliches Objekt?

Vielen Dank

8
Dan

Es ist ein dateiähnliches Objekt. Lese sie:

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

Wenn die von body eingehenden Daten zu groß sind, um in den Speicher eingelesen zu werden, sollten Sie Ihren Code umgestalten und zlib.decompressobj statt zlib.decompress.

13
wim

Wenn Sie zuerst in das Objekt schreiben, stellen Sie sicher, dass Sie den Stream zurücksetzen, bevor Sie Folgendes lesen:

>>> 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'

oder holen Sie sich die Daten direkt mit getvalue

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