您好,登錄后才能下訂單哦!
因?yàn)檠芯可A段經(jīng)常用MATLAB作圖,處理數(shù)據(jù),但是MATLAB太過于龐大,不方便,就想用python處理。
問題:我們通常處理的最原始的數(shù)據(jù)是bin文件,打開后如下所示,是按16進(jìn)制形式存儲(chǔ)的。
MATLAB處理時(shí),是按照如下方式讀取前10個(gè)數(shù),int32數(shù)據(jù)格式,上圖中的紅色圈表示MATLAB讀取的一個(gè)數(shù)據(jù),前10個(gè)數(shù)據(jù)表示元數(shù)據(jù)。
MATLAB讀取的前10個(gè)數(shù)據(jù)的結(jié)果:
而Python中似乎沒有可以在指定數(shù)據(jù)格式位數(shù)下讀取bin文件中數(shù)據(jù),例如想以python中的read()讀取時(shí),圖一中的藍(lán)線所圈的表示一個(gè)數(shù)據(jù),圖中圈了兩個(gè)數(shù)據(jù)。用以下程序讀取MATLAB所讀取的10各數(shù)據(jù),則需要讀40個(gè)。
結(jié)果如下:也是16進(jìn)制
每隔三個(gè)數(shù)據(jù)對(duì)應(yīng)時(shí)MATLAB讀取的數(shù)據(jù)。
想到用struct包里面的unpack函數(shù)解決問題,可以可惜的時(shí)python中unpack不支持float32,也不支持int32,所以上面在用python讀取數(shù)據(jù)時(shí),不能以32位讀取,最多以8位讀,從而python挨個(gè)讀取時(shí)一個(gè)藍(lán)線圈里的數(shù)據(jù)。
# 按照給定的格式(fmt)解析字節(jié)流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) |
個(gè)人覺得python這方面做的沒有matlab好,
所以python不能以類似于MATLAB中fread(f,N,int32)或者fread(f,N,real*4)的方式讀取上圖中的字符流,也無法解析。
以上這篇Python3按一定數(shù)據(jù)位數(shù)格式處理bin文件的方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。