#python
#python
Вопрос:
Я хотел бы использовать объект BytesIO в качестве непрерывного буфера (распространенный вариант использования). Однако возможно ли удалить байты из заголовка, которые больше не нужны?
Это не похоже на это, поскольку существует только метод truncate ().
['__class__', '__delattr__', '__doc__', '__enter__', '__exit__', '__format__', '__getattribute__', '__getstate__', '__hash__', '__init__', '__iter__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '_checkClosed', '_checkReadable', '_checkSeekable', '_checkWritable', 'close', 'closed', 'detach', 'fileno', 'flush', 'getvalue', 'isatty', 'next', 'read', 'read1', 'readable', 'readinto', 'readline', 'readlines', 'seek', 'seekable', 'tell', 'truncate', 'writable', 'write', 'writelines']
Ответ №1:
Нет, вы не можете, так как BytesIO
это версия общего файлового объекта в памяти.
Как таковой, он обрабатывается как последовательность байтов, которые могут быть перезаписаны или добавлены, и точно так же, как файл, удаление элементов спереди неэффективно, поскольку требует полной перезаписи всех последующих данных.
Вероятно, вместо этого вы захотите изучить collections.deque()
тип.
Комментарии:
1. Я могу придумать альтернативную реализацию, при которой базовый объект IOBase реализует серию блоков памяти. Поведение удаления, хотя и не то, о котором я спрашивал, может быть эмулировано простым удалением фрагментов заголовка по мере их исчерпания… Если запрашивается такая функциональность. В остальном, никакого вреда не причинено. Поскольку я предполагаю, что реализация IOBase / BytesIO уже использует серию необязательно смежных блоков памяти, а не один непрерывный блок памяти, я не рассматриваю это как резкое отклонение от существующего дизайна.
2.
BytesIO
использует одинchar *buf
объект для хранения данных. То, что вы хотите, это нестандартное использование файлов, а стандартная библиотека этого не предлагает.