python - 使用 mmap 读取具有偏移量的二进制文件

标签 python binary mmap

我的目标是使用 mmap() 和类读取二进制文件。问题是我想从文件中获取的数据不在字节位置 0,偏移量为 24。如果我将此偏移量设置为 mmap 函数 mmap.mmap(fd, length, access, offset = 24) 出现错误,因为偏移量必须是粒度的倍数。我的代码是:

class StructHeader(Structure):
    _pack_ = 1
    _fields_ = [('nothing', c_char*24),('v1', c_ubyte),('v2', c_ubyte)]

d_arrayHeader = StructHeader*1

if __name__ == '__main__':
    fd = os.open(filePath, os.O_RDWR)
    granularity = mmap.ALLOCATIONGRANULARITY

    mmap_file = mmap.mmap(fd, length=187, access=mmap.ACCESS_WRITE, offset=0)

    data = d_arrayHeader.from_buffer(mmap_file)

    i = data[0]

    print i.v1, i.v2

我想到了三种解决方案:

  • 获取整个 mmap 和之后的 data = d_arrayHeaderLAS.from_buffer(mmap_file[24:]) 其中 from_buffer() 的参数是 mmap 的子数组。问题是这个子数组从 mmap 对象转换为 str,它不起作用。
  • 第二种解决方案是添加一个长度为 24 字节的新字段(如代码第 3 行所示)。
  • 我知道如何使用 struct.unpack() 来完成,但我不想使用它,因为它比较慢。

我想知道是否有更简单的方法来获取带偏移量的 mmap。我展示的这种情况很简单,但我想在更复杂的情况下使用它,例如从偏移量等于 header 的二进制文件中获取数据。在这些情况下, header 和数据结构不同,我应该使用不同的类。我需要它很快,因为文件太大了。

谢谢。

最佳答案

您可以使用“mmap_file.seek(0)”使文件指针偏移为零...

关于python - 使用 mmap 读取具有偏移量的二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40884957/

相关文章:

Python:沿特定维度查找大于阈值的最大数组索引

Java 整数到二进制转换器代码

c - `mmap()` 手动并发预故障/分页

c++ - 使用匿名 mmap() 检查实际分配的页面数

c - ELF64加载和内存对齐

python - 我无法使用 FIND_NEXT_SIBLING 而不是 PARENT 和 NEXT_ELEMENT 优化 beautifulsoup 查询

Python 脚本使用所有 RAM

python - 余弦相似度与余弦距离

hadoop - 使用hadoop文件系统org.apache.hadoop.fs.FileSystem写二进制文件

c++ - 将 vector<double> 写入二进制文件并再次读取