web-dev-qa-db-fra.com

Comment convertir de '_io.BytesIO' en un objet de type octets en python3.6?

J'utilise cette fonction pour décompresser le corps ou une réponse HTTP si elle est compressée avec gzip, compresser ou dégonfler.

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

Cependant python lève ce message d'erreur.

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

sur cette ligne:

return zlib.decompress(body)

Essentiellement, comment convertir de '_io.BytesIO' en un objet semblable à des octets?

Merci

8
Dan

C'est un objet de type fichier. Lis-les:

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

Si les données provenant de body sont trop volumineuses pour être lues en mémoire, vous devrez refactoriser votre code et utiliser zlib.decompressobj au lieu de zlib.decompress.

13
wim

Si vous écrivez d'abord dans l'objet, assurez-vous de réinitialiser le flux avant de lire:

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

ou obtenez directement les données avec 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