根据 Python io.BytesIO 的 write()、read() 和 getvalue() 方法如何工作?,似乎
io.BytesIO
将复制提供的初始字节。
我有一个缓冲区,我希望
pickle
直接转储该缓冲区中的对象,而不需要任何副本。所以我尝试使用f = io.BytesIO(buffer)
。然而,在f.write
之后,我的buffer
并没有被修改。
这是一个例子:
a = bytearray(1024)
import io
b = io.BytesIO(memoryview(a))
b.write(b"1234")
a[:4] # a does not change
我想要的是让
io.BytesIO
直接写入我的缓冲区。
我的最终目标是:
a = bytearray(1024)
import io, pickle
with io.BytesIO(memoryview(a)) as f:
obj = [1, 2, 3]
pickle.dump(obj, f)
# a should hold the pickled data of obj
IIUC你可以尝试制作自己的IO类:
import io
import pickle
class MyIO(io.IOBase):
def __init__(self, buf):
self.buf = memoryview(buf)
def write(self, b):
self.buf[: len(b)] = b
a = bytearray(1024)
with MyIO(a) as f:
obj = [1, 2, 3]
pickle.dump(obj, f)
print(a)
打印:
bytearray(b'\x80\x04\x95\x0b\x00\x00\x00\x00\x00\x00\x00]\x94(K\x01K\x02K\x03e.\x00\x00\x00 ...