在Python中切片文件

在Python中切片文件,python,file,buffer,bytearray,Python,File,Buffer,Bytearray,我最近一直在编写一个脚本,该脚本可以获取文件,将其分块并分析每个片段。因为分块位置取决于内容,所以我需要一次读取一个字节。我不需要随机访问,只需要从头到尾线性地读取它,在我前进的过程中选择某些位置,并产生从先前选择的位置到当前位置的块的内容 使用由bytearray包装的内存映射文件非常方便。我没有生成块,而是生成块的偏移量和大小,让外部函数对其进行切片 它也比在字节数组中积累当前块快(并且比在字节中积累快得多))。但我有一些问题要解决: bytearray正在复制数据吗 我以rb的形式打开文件

我最近一直在编写一个脚本,该脚本可以获取文件,将其分块并分析每个片段。因为分块位置取决于内容,所以我需要一次读取一个字节。我不需要随机访问,只需要从头到尾线性地读取它,在我前进的过程中选择某些位置,并产生从先前选择的位置到当前位置的块的内容

使用由
bytearray
包装的内存映射文件非常方便。我没有生成块,而是生成块的偏移量和大小,让外部函数对其进行切片

它也比在
字节数组中积累当前块快(并且比在
字节中积累快得多)
)。但我有一些问题要解决:

  • bytearray正在复制数据吗
  • 我以
    rb
    的形式打开文件,并使用
    access=mmap.access\u READ
    打开
    mmap
    。但原则上,
    bytearray
    是一个可变的容器。这是性能问题吗?是否有我应该使用的只读容器
  • 因为我不在缓冲区中累积,所以我随机访问
    bytearray
    (因此也访问底层文件)。即使它可能会被缓冲,但根据文件大小和系统内存,恐怕也会出现问题。这真的是个问题吗

  • 你可以做这个小把戏

    import mmap
    
    class memmap(mmap.mmap):
        def read_byte(self):
            return ord(super(memmap,self).read_byte())
    
    创建一个从mmap类继承的类,并将返回长度为1的字符串的默认读取字节覆盖为返回int的字符串。然后您可以将该类用作任何其他mmap类

    我希望这有帮助

  • 将一个对象转换为可变对象会导致数据复制。您可以使用以下命令将文件直接读取到bytearray:

    f = open(FILENAME, 'rb')
    data = bytearray(os.path.getsize(FILENAME))
    f.readinto(data)
    
  • 存在字符串到bytearray的转换,因此存在潜在的性能问题

  • bytearray是一个数组,因此它可以达到PY_SSIZE_T_MAX/sizeof(PyObject*)的限制。欲了解更多信息,请访问


  • 你能读懂资料来源吗?它在Objects文件夹中。什么Python版本?另外,您如何将
    mmap
    包装到您的
    bytearray
    ?@Veedrac我的目标是2.7和3.4。现在,我正在Python3上执行bytearray(mmap()),您可以使用
    memoryview
    ,但是
    mmap
    不支持2.x上的
    memoryview
    协议。尽管您的解释非常详细,但一段代码将非常有用。