2011-11-23 16 views
6

Leí el búfer de datos de algún lugar a bytearray. Ahora, yo quiero trabajar con estos datos mediante interfaz de flujo similar (es decir read, seek etc.)Python 3: interfaz de secuencia no copiada a bytearray?

¿Puedo envolver mi bytearray con io.BytesIO?

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

Mi temor aquí es BytesIO copias de datos de mybytearray, pero no quiero que - desde el buffer es muy grande. No quiero copias, quiero que la transmisión funcione con datos originales y también puede modificarla. ¿Qué se puede hacer?

Respuesta

8

BytesIO administra su propia memoria y copiará un búfer utilizado para inicializarlo. Puede encapsular su bytearray en una clase similar a un archivo. O puede ir por el otro lado, permitiendo que el objeto BytesIO maneje la asignación de memoria. Entonces se puede obtener una vista de la memoria intermedia que puede ser modificado por el índice y cortar en rodajas, pero no se puede cambiar el tamaño de la memoria intermedia mientras exista la vista:

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

Editar:

Ver issue 22003, BytesIO copia-en-escritura. El parche más reciente (cow6) solo admite copia en escritura para bytes.

Cuestiones relacionadas