2011-11-23 52 views
6

我從某處讀取數據緩衝區到bytearray。現在,我想這個數據使用流式界面一起工作(即readseek等)Python 3 - 非複製流接口到bytearray?

可我只是換我bytearrayio.BytesIO?這裏

mybytearray = bytearray(...) 
stream = io.BytesIO(mybytearray) 

我擔心的是mybytearrayBytesIO拷貝數據,但我不希望它 - 因爲緩存是非常大的。我不想要副本,我希望流能夠處理原始數據,並且可以修改它。可以做什麼?

回答

8

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 22003BytesIO copy-on-write。最新的補丁(cow6)僅支持bytes的寫入時複製。