• python 读取二进制数据到可变缓冲区中


    想直接读取二进制数据到一个可变缓冲区中,而不需要做任何的中间复制操作。或者你想原地修改数据并将它写回到一个文件中去。

    为了读取数据到一个可变数组中,使用文件对象的readinto() 方法。比如

    import os.path
    def read_into_buffer(filename):
    buf = bytearray(os.path.getsize(filename))
    with open(filename, 'rb') as f:
    f.readinto(buf)
    return buf
    

     下面是一个演示这个函数使用方法的例子:

    >>> with open('sample.bin', 'wb') as f:
    ... f.write(b'Hello World')
    ...
    >>> buf = read_into_buffer('sample.bin')
    >>> buf
    bytearray(b'Hello World')
    >>> buf[0:5] = b'Hallo'
    >>> buf
    bytearray(b'Hallo World')
    >>> with open('newsample.bin', 'wb') as f:
    ... f.write(buf)
    ...
    11
    >>>
    

    文件对象的readinto() 方法能被用来为预先分配内存的数组填充数据,甚至包括由array 模块或numpy 库创建的数组。和普通read() 方法不同的是, readinto() 填充已存在的缓冲区而不是为新对象重新分配内存再返回它们。因此,你可以使用它来避免大量的内存分配操作。比如,如果你读取一个由相同大小的记录组成的二进制文件时,你可以像下面这样写:

    record_size = 32 # Size of each record (adjust value)
    buf = bytearray(record_size)
    with open('somefile', 'rb') as f:
    while True:
    n = f.readinto(buf)
    if n < record_size:
    break
    # Use the contents of buf
    

    另外有一个有趣特性就是memoryview ,它可以通过零复制的方式对已存在的缓冲区执行切片操作,甚至还能修改它的内容。比如:

    >>> buf
    bytearray(b'Hello World')
    >>> m1 = memoryview(buf)
    >>> m2 = m1[-5:]
    >>> m2
    <memory at 0x100681390>
    >>> m2[:] = b'WORLD'
    >>> buf
    bytearray(b'Hello WORLD')
    >>>
    

    使用f.readinto() 时需要注意的是,你必须检查它的返回值,也就是实际读取的字节数。如果字节数小于缓冲区大小,表明数据被截断或者被破坏了(比如你期望每次读取指定数量的字节)。最后,留心观察其他函数库和模块中和into 相关的函数(比如recv into() ,pack into() 等)。Python 的很多其他部分已经能支持直接的I/O 或数据访问操作,这些操作可被用来填充或修改数组和缓冲区内容。

  • 相关阅读:
    Python中if __name__ == '__main__':的作用
    Java集合面试题及答案总结(2020版)
    Java多线程面试题及答案(2020版)
    poi: 如何获取cell的行号对应的字母
    gogs: 进入Docker实例并修改MySQL帐号
    多音源多声卡背景音乐播放系统,可在一台电脑上同时播放10种音乐
    弱电图纸中敷设方式符号表示大全
    HashMap集合详解----源码分析--之--高级篇
    正则表达式总结及主要事项
    使用接口进行form表单提交
  • 原文地址:https://www.cnblogs.com/baxianhua/p/10208378.html
Copyright © 2020-2023  润新知