使用python中的混合数据类型读取未知大小的二进制文件

时间:2017-07-20 19:01:34

标签: python

我需要读取二进制文件,其中包含19个float32个数字,后跟未知数量的uint32个数字。如何在python中读取这样的文件?

在Matlab中,等价物如下所示:

fid = fopen('myFile.bin','r');
params = fread(fid,19,'float');
data = fread(fid,'uint32');
fclose(fid);

2 个答案:

答案 0 :(得分:4)

使用numpy.fromfile() method并传递一个文件句柄,并附上相应数量的项目。

import numpy as np
with open('myFile.bin', 'rb') as f:
    params = np.fromfile(f, dtype=np.float32, count=19)
    data = np.fromfile(f, dtype=np.int32, count=-1) # I *assumed* here your ints are 32-bit

如果您希望获得标准Python列表而不是.tolist()数组,请将fromfile()发布到np.fromfile(...).tolist()(例如:numpy)的关闭位置。

答案 1 :(得分:1)

为了阅读二进制文件,我建议使用struct package

解决方案可以写成如下:

import struct

f = open("myFile.bin", "rb")

floats_bytes = f.read(19 * 4)
# here I assume that we read exactly 19 floats without errors

# 19 floats in array
floats_array = struct.unpack("<19f", floats_bytes)

# convert to list beacause struct.unpack returns tuple
floats_array = list(floats_array)

# array of ints
ints_array = []

while True:
    int_bytes = r.read(4)

    # check if not eof
    if not int_bytes:
        break

    int_value = struct.unpack("<I", int_bytes)[0]

    ints_array.append(int_value)

f.close()

请注意,我假设您的数字以小端字节顺序存储, 所以我用“&lt;”格式化字符串。