Python 3 - bytearray的非复制流接口?

时间:2011-11-23 03:57:52

标签: python stream python-3.x bytearray

我从某处读取数据缓冲区到bytearray。现在,我想使用类似流的界面(即readseek等)来处理这些数据。

我可以用bytearray

包裹io.BytesIO吗?
mybytearray = bytearray(...)
stream = io.BytesIO(mybytearray)

我担心BytesIO复制mybytearray的数据,但我不想要它 - 因为缓冲区非常大。我不想要副本,我希望流可以处理原始数据并且也可以修改它。可以做些什么?

1 个答案:

答案 0 :(得分:9)

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的写时复制。