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

时间:2015-05-08 12:46:22

标签: python arrays numpy binary

我有一个二进制文件,其中包含一个平面位置的记录。 每条记录如下:

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)

因此每条记录的长度为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),
])

我正在使用fromfile阅读文件:

a_bytes = np.fromfile(filename, dtype=dtype)

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

2 个答案:

答案 0 :(得分:15)

您可以打开标准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 

答案 1 :(得分:3)

我遇到了类似的问题,但上面的答案都没有让我满意。 我需要实现像虚拟表这样的东西,其中包含大量的二进制记录,这些记录可能占用的内存超出了我在一个numpy数组中所能承受的内存。所以我的问题是如何从/向二进制文件读取和写入一小组整数 - 一个文件的子集到numpy数组的子集。

这是一个对我有用的解决方案:

{{1}}