因为研究生阶段经常用matlab作图,处理数据,但是matlab太过于庞大,不方便,就想用python处理。
问题:我们通常处理的最原始的数据是bin文件,打开后如下所示,是按16进制形式存储的。
matlab处理时,是按照如下方式读取前10个数,int32数据格式,上图中的红色圈表示matlab读取的一个数据,前10个数据表示元数据。
matlab读取的前10个数据的结果:
而python中似乎没有可以在指定数据格式位数下读取bin文件中数据,例如想以python中的read()读取时,图一中的蓝线所圈的表示一个数据,图中圈了两个数据。用以下程序读取matlab所读取的10各数据,则需要读40个。
结果如下:也是16进制
每隔三个数据对应时matlab读取的数据。
想到用struct包里面的unpack函数解决问题,可以可惜的时python中unpack不支持float32,也不支持int32,所以上面在用python读取数据时,不能以32位读取,最多以8位读,从而python挨个读取时一个蓝线圈里的数据。
# 按照给定的格式(fmt)解析字节流string,返回解析出来的tuple
unpack(fmt, string)
string类似于:\x00\x00\x00\x0c\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00]\x00\x00\x00\x0c\x00\x00\x00\x08\x00\x00\x00\t\x00\x00
format | c type | python type | standard size | notes |
---|---|---|---|---|
x | pad byte | no value | ||
c | char | string of length 1 | 1 | |
b | signed char | integer | 1 | (3) |
b | unsigned char | integer | 1 | (3) |
? | _bool | bool | 1 | (1) |
h | short | integer | 2 | (3) |
h | unsigned short | integer | 2 | (3) |
i | int | integer | 4 | (3) |
i | unsigned int | integer | 4 | (3) |
l | long | integer | 4 | (3) |
l | unsigned long | integer | 4 | (3) |
q | long long | integer | 8 | (2), (3) |
q | unsigned long long | integer | 8 | (2), (3) |
f | float | float | 4 | (4) |
d | double | float | 8 | (4) |
s | char[] | string | ||
p | char[] | string | ||
p | void * | integer |
(5), (3) |
个人觉得python这方面做的没有matlab好,
所以python不能以类似于matlab中fread(f,n,int32)或者fread(f,n,real*4)的方式读取上图中的字符流,也无法解析。
以上这篇python3按一定数据位数格式处理bin文件的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/qq_25948717/article/details/80341390