2011-11-23 73 views
6

我从某处读取数据缓冲区到bytearray。现在,我想这个数据使用流式界面一起工作(即readseek等)Python 3 - 非复制流接口到bytearray?

可我只是换我bytearrayio.BytesIO?这里

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

我担心的是mybytearrayBytesIO拷贝数据,但我不希望它 - 因为缓存是非常大的。我不想要副本,我希望流能够处理原始数据,并且可以修改它。可以做什么?

回答

8

BytesIO管理自己的内存,并将复制用于初始化它的缓冲区。你可以将你的bytearray封装在一个类似文件的类中。或者你可以换个方式,让BytesIO对象处理内存分配。然后在视图存在,你可以得到可以通过索引和切片进行修改缓冲区的观点,但你不能重新大小的缓冲区:

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

编辑:

issue 22003BytesIO copy-on-write。最新的补丁(cow6)仅支持bytes的写入时复制。