使用Numpy fromfile和给定的偏移量读取二进制文件

scl*_*cls 17 python arrays binary numpy

我有一个二进制文件,其中包含一个平面位置的记录.每条记录看起来像:

0x00: Time, float32
0x04: X, float32 // X axis position
0x08: Y, float32 // Y axis position
0x0C: Elevation, float32
0x10: float32*4 = Quaternion (x,y,z axis and w scalar)
0x20: Distance, float32 (unused)
Run Code Online (Sandbox Code Playgroud)

所以每条记录长32个字节.

我想得到一个Numpy阵列.

在偏移1859处,存在无符号的int 32(4字节),其指示阵列的元素的数量.在我的情况下12019.

我不关心(现在)标题数据(偏移1859之前)

数组仅从偏移1863(= 1859 + 4)开始.

我定义了自己的Numpy dtype之类的

dtype = np.dtype([
    ("time", np.float32),
    ("PosX", np.float32),
    ("PosY", np.float32),
    ("Alt", np.float32),
    ("Qx", np.float32),
    ("Qy", np.float32),
    ("Qz", np.float32),
    ("Qw", np.float32),
    ("dist", np.float32),
])
Run Code Online (Sandbox Code Playgroud)

我正在阅读文件使用fromfile:

a_bytes = np.fromfile(filename, dtype=dtype)
Run Code Online (Sandbox Code Playgroud)

但我没有看到任何参数提供fromfile传递偏移量.

rep*_*cus 18

您可以打开标准python文件打开文件,然后寻找跳过标题,然后传入文件对象fromfile.像这样的东西:

import numpy as np
import os

dtype = np.dtype([
    ("time", np.float32),
    ("PosX", np.float32),
    ("PosY", np.float32),
    ("Alt", np.float32),
    ("Qx", np.float32),
    ("Qy", np.float32),
    ("Qz", np.float32),
    ("Qw", np.float32),
    ("dist", np.float32),
])

f = open("myfile", "rb")
f.seek(1863, os.SEEK_SET)

data = np.fromfile(f, dtype=dtype)
print x 
Run Code Online (Sandbox Code Playgroud)

  • 谢谢.它解决了我的问题.我还注意到`data = np.memmap(filename,dtype = dtype,mode ='r',offset = offset_array,shape = N)`` (6认同)
  • 对,如果它是一个大文件,那么内存映射可能是要走的路。 (2认同)