2024-05-29 02:18:05 发布
网友
我把数据缓冲区从某处读到bytearray。现在,我想使用流式接口来处理这些数据(即read,seek等)
bytearray
read
seek
我可以用io.BytesIO来包装我的bytearray吗?在
io.BytesIO
mybytearray = bytearray(...) stream = io.BytesIO(mybytearray)
我担心的是BytesIO复制mybytearray的数据,但我不想要它-因为缓冲区非常大。我不需要拷贝,我希望流在原始数据上工作并且可以修改它。能做什么?在
BytesIO
mybytearray
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写入时复制。最新的补丁(cow6)只支持bytes的写时拷贝。在
bytes
BytesIO
管理自己的内存,并将复制用于初始化它的缓冲区。您可以将您的bytearray
封装在类似文件的类中。或者您可以走另一条路,让BytesIO
对象处理内存分配。然后,您可以获得可以通过索引和切片修改的缓冲区视图,但不能在视图存在时重新调整缓冲区的大小:编辑:
请参见issue 22003,
BytesIO
写入时复制。最新的补丁(cow6)只支持bytes
的写时拷贝。在相关问题 更多 >
编程相关推荐