如何在Python中使用io.BytesIO写入现有缓冲区?

问题描述 投票:0回答:1

根据 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
python
1个回答
0
投票

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  ...
© www.soinside.com 2019 - 2024. All rights reserved.