我从某处读取数据缓冲区到bytearray
。现在,我想使用类似流的界面(即read
,seek
等)来处理这些数据。
我可以用bytearray
io.BytesIO
吗?
mybytearray = bytearray(...)
stream = io.BytesIO(mybytearray)
我担心BytesIO
复制mybytearray
的数据,但我不想要它 - 因为缓冲区非常大。我不想要副本,我希望流可以处理原始数据并且也可以修改它。可以做些什么?
答案 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 22003,BytesIO
copy-on-write。最新的补丁(cow6)仅支持bytes
的写时复制。