2011-11-23 33 views
6

Tôi đọc bộ đệm dữ liệu từ đâu đó đến bytearray. Bây giờ, tôi muốn làm việc với dữ liệu này bằng cách sử dụng giao diện giống như luồng (ví dụ: read, seek v.v.)Python 3 - giao diện luồng không sao chép sang bytearray?

Tôi chỉ cần quấn bytearray với io.BytesIO?

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

sợ hãi của tôi ở đây là BytesIO bản sao dữ liệu mybytearray, nhưng tôi không muốn nó - kể từ đệm là rất lớn. Tôi không muốn các bản sao, tôi muốn luồng hoạt động trên dữ liệu gốc và có thể sửa đổi nó. Những gì có thể được thực hiện?

Trả lời

8

BytesIO quản lý bộ nhớ của chính nó và sẽ sao chép bộ đệm được sử dụng để khởi tạo bộ nhớ. Bạn có thể đóng gói bytearray của mình trong một lớp giống như tệp. Hoặc bạn có thể đi theo cách khác, để cho đối tượng BytesIO xử lý phân bổ bộ nhớ. Sau đó, bạn có thể nhận được một cái nhìn của bộ đệm có thể được sửa đổi theo chỉ số và lát, nhưng bạn không thể thay đổi kích thước bộ đệm trong khi quan điểm tồn tại:

>>> 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' 

Edit:

Xem issue 22003, BytesIO sao chép-trên-ghi. Bản vá mới nhất (cow6) chỉ hỗ trợ copy-on-write cho bytes.

Các vấn đề liên quan