2011-11-23 14 views
6

Ho letto il buffer dei dati da qualche parte a bytearray. Ora, io voglio lavorare con questi dati utilizzando l'interfaccia flusso simile (cioè read, seek ecc)Python 3 - Interfaccia di flusso non di copia per bytearray?

Posso solo avvolgere la mia bytearray con io.BytesIO?

mybytearray = bytearray(...) 
stream = io.BytesIO(mybytearray) 

Il mio timore è qui BytesIO copia i dati di mybytearray, ma io non lo voglio - dal buffer è molto grande. Non voglio copie, voglio che lo streaming funzioni sui dati originali e può anche modificarlo. Cosa si può fare?

risposta

8

BytesIO gestisce la propria memoria e copia un buffer utilizzato per inizializzarlo. Puoi incapsulare il tuo bytearray in una classe simile a un file. Oppure puoi andare dall'altra parte, lasciando che l'oggetto BytesIO gestisca l'allocazione della memoria. Poi si può ottenere una vista del buffer che può essere modificato in base all'indice e fetta, ma non è possibile ridimensionare il buffer mentre la vista esiste:

>>> f = io.BytesIO(b'abc') 
>>> view = f.getbuffer() 

>>> view[:] = b'def' 
>>> f.getvalue() 
b'def' 

>>> view[3] = b'g' 
IndexError: index out of bounds 

>>> f.seek(0, 2) 
>>> f.write(b'g') 
BufferError: Existing exports of data: object cannot be re-sized 

>>> del view 
>>> f.write(b'g') 
>>> f.getvalue() 
b'defg' 

Edit:

See issue 22003, BytesIO copy-on-write. L'ultima patch (cow6) supporta solo la copia su scrittura per bytes.