【问题标题】:Python 3 - non-copying stream interface to bytearray?Python 3 - 字节数组的非复制流接口?
【发布时间】:2012-01-04 10:42:10
【问题描述】:

我从某处读取数据缓冲区到bytearray。现在,我想使用类似流的接口(即readseek 等)处理这些数据

我可以用io.BytesIO 包裹我的bytearray 吗?

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

我在这里担心BytesIO 复制mybytearray 的数据,但我不想要它 - 因为缓冲区非常大。我不想要副本,我希望流能够处理原始数据并且也可以修改它。可以做什么?

【问题讨论】:

    标签: python stream python-3.x bytearray


    【解决方案1】:

    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 写入时复制。最新补丁 (cow6) 仅支持 bytes 的写时复制。

    【讨论】:

      猜你喜欢
      • 2011-11-25
      • 2010-12-16
      • 1970-01-01
      • 2018-04-02
      • 2013-12-22
      • 2015-03-19
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      相关资源
      最近更新 更多