读写bin
前言
工程中經(jīng)常將參數(shù)文件存儲(chǔ)為bin格式, 但是實(shí)際中為了分析其參數(shù), 也不好用C++去讀取調(diào)試它, 所以可以用matlab或者python去讀取它, 但是還是蠻坑的
Matlab中的讀取和寫入
寫入文件
比較坑的是, 一定要注意自己的文件存儲(chǔ)的類型, 比如數(shù)值是float還是double之類的, 不然很容易在讀取的時(shí)候出問題.
關(guān)于數(shù)字的寫入方法如下:
fileID=fopen('MatrixTest.bin','w');%w+是不擦除,直接附加內(nèi)容 a=[1,2,3;4,5,6;7,8,9]; fwrite(fileID,a,'double');%存儲(chǔ)為double類型 fclose(fileID);文本的寫入方法同樣:
fileID=fopen('TxtTest.bin','w');%w+是不擦除,直接附加內(nèi)容 a='哈哈哈哈嗝'; fwrite(fileID,a,'char');%寫入格式char fclose(fileID);讀文件
一定要與寫入的數(shù)據(jù)類型相同
讀取bin中存儲(chǔ)的矩陣
fileID=fopen('MatrixTest.bin'); A=fread(fileID,[17,17],'double') fclose(fileID); %% 輸出 A'ans =1 4 7 2 5 8 3 6 9可以發(fā)現(xiàn)matlab是列讀取的, 如果我們知道矩陣的大小,那么就可以指定好
fileID=fopen('MatrixTest.bin'); A=fread(fileID,[3,3],'double') fclose(fileID); %輸出 A =1 2 34 5 67 8 9如果我們將double類型替換成float,得到的結(jié)果就是
A =0 2.2500 01.8750 0 2.00000 2.4375 0可以發(fā)現(xiàn)是完全錯(cuò)誤的,當(dāng)然我們不指定類型, 即去掉double, 最終的結(jié)果也是錯(cuò)誤的, 因而這個(gè)格式需要非常嚴(yán)格.
讀取文本就需要用另一個(gè)函數(shù)native2unicode,而且不需要指定數(shù)據(jù)類型
fileID=fopen('TxtTest.bin'); A=fread(fileID); native2unicode(A') fclose(fileID); %輸出 ans =哈哈哈哈嗝Python中的讀取和寫入
主要涉及到tofile和fromfile兩個(gè)函數(shù), 同時(shí)也必須注意存儲(chǔ)的矩陣數(shù)值的類型
寫入文件
import numpy as np import sys a=np.arange(1,10,1).reshape(3,-1) a=np.asarray(a,dtype='float') a.tofile('matrix_a.bin')這樣我們就在bin文件中存儲(chǔ)了一個(gè)矩陣, 類型為float
[[ 1. 2. 3.][ 4. 5. 6.][ 7. 8. 9.]]讀取文件
讀取就很簡(jiǎn)單了,就一個(gè)函數(shù),只不過要提前知道數(shù)據(jù)類型
b=np.fromfile('matrix_a.bin','float') #輸出 #[ 1. 2. 3. 4. 5. 6. 7. 8. 9.]總結(jié)
從這里可以發(fā)現(xiàn), 無論是matlab還是python, 我們存儲(chǔ)和讀取的時(shí)候的數(shù)據(jù)類型一定要一致,不然讀到的結(jié)果就是錯(cuò)誤的. 還可以發(fā)現(xiàn)matlab是按列存儲(chǔ), python是按行存儲(chǔ)的
總結(jié)
- 上一篇: 【theano-windows】学习笔记
- 下一篇: 【theano-windows】学习笔记