我从某处读取数据缓冲区到 bytearray
。现在,我想使用类似流的界面(即 read
、seek
等)来处理这些数据
我可以用 io.BytesIO
包装我的 bytearray
吗?
mybytearray = bytearray(...)
stream = io.BytesIO(mybytearray)
我担心的是 BytesIO
复制 mybytearray
的数据,但我不想要它 - 因为缓冲区非常大。我不想要副本,我希望流能够处理原始数据并且也可以修改它。可以做什么?
最佳答案
BytesIO
管理自己的内存并将复制用于初始化它的缓冲区。您可以将您的 bytearray
封装在一个类似文件的类中。或者您可以采用另一种方式,让 BytesIO
对象处理内存分配。然后你可以得到一个缓冲区的 View ,可以通过索引和切片修改,但是当 View 存在时你不能重新调整缓冲区的大小:
>>> 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 22003 , BytesIO
写时复制。最新补丁 (cow6) 仅支持 bytes
的写时复制。
关于Python 3 - 非复制流接口(interface)到 bytearray?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8237122/