Python 3 - не копирующий потоковый интерфейс в bytearray? - PullRequest
8 голосов
/ 23 ноября 2011

Я читаю буфер данных откуда-то до bytearray. Теперь я хочу работать с этими данными, используя потоковый интерфейс (то есть read, seek и т. Д.)

Могу ли я просто обернуть bytearray io.BytesIO?

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

Я боюсь, что BytesIO копирует данные mybytearray, но я не хочу этого - так как буфер очень большой. Я не хочу копий, я хочу, чтобы поток работал с исходными данными и тоже мог их изменять. Что можно сделать?

1 Ответ

9 голосов
/ 23 ноября 2011

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'

Редактировать:

См. выпуск 22003 , BytesIO копирование при записи.Последний патч (cow6) поддерживает копирование при записи только для bytes.

...