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

zah*_*pov 10 python bytearray stream python-3.x

我从某处读取数据缓冲区bytearray.现在,我想用流一样的界面(即该数据的工作read,seek等等)

我可以随身bytearray携带io.BytesIO吗?

mybytearray = bytearray(...)
stream = io.BytesIO(mybytearray)
Run Code Online (Sandbox Code Playgroud)

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

Ery*_*Sun 12

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'
Run Code Online (Sandbox Code Playgroud)

编辑:

请参见问题22003,BytesIO写时复制.最新的补丁(cow6)仅支持copy-on-write bytes.