最近笔者在处理数据时,遇到.mat文件,遂记录下自己的理解与处理步骤。
.mat文件是Matlab中常用的数据格式,形式类似json键值对。
{'__header__': b'MATLAB 5.0 MAT-file Platform: nt, Created on: Wed Sep 9 16:13:43 2020', '__version__': '1.0', '__globals__': [], 'key1': array([[0, 1]]), 'key2': array([[3]])}
在Python中,需要通过scipy来操作.mat文件。首先如未安装,请执行:
pip install scipy
import scipy.io as sio
data1 = {
"key1":[0,1],
"key2":3
}
sio.savemat("save.mat",data1)
此时可以发现当前文件夹下面多了一个"save.mat"文件
import scipy.io as sio
data1 = {
"key1":[0,1],
"key2":3
}
#sio.savemat("save.mat",data1)
data2 = sio.loadmat("save.mat")
print("data1: ",type(data1),data1)
print("data2: ",type(data2),data2)
输出:
(ml) Y:\song\Codes\face_recall>python deal_data.py
data1: <class 'dict'> {'key1': [0, 1], 'key2': 3}
data2: <class 'dict'> {'__header__': b'MATLAB 5.0 MAT-file Platform: nt, Created on: Wed Sep 9 16:13:43 2020', '__version__': '1.0', '__globals__': [],
'key1': array([[0, 1]]), 'key2': array([[3]])}
可以看出,mat文件内容被保存时,会自动添加一些信息:__header__,__version__,__globals__
'__header__': b'MATLAB 5.0 MAT-file Platform: nt, Created on: Wed Sep 9 16:13:43 2020', '__version__': '1.0', '__globals__': []
同时还是dict格式数据,修改的是list或者scale会转化为array,这个可以看做numpy.array
操作三:修改mat文件
import scipy.io as sio
data1 = {
"key1":[0,1],
"key2":3
}
#sio.savemat("save.mat",data1)
data2 = sio.loadmat("save.mat")
print("data1: ",type(data1),data1)
print("data2: ",type(data2),data2)
data2["__version__"] = "2.0"
data2["key2"] = 4
sio.savemat("save.mat",data2)
data3 = sio.loadmat("save.mat")
print("data3: ",type(data3),data3)
输出:
(ml) Y:\song\Codes\face_recall>python deal_data.py
data1: <class 'dict'> {'key1': [0, 1], 'key2': 3}
data2: <class 'dict'> {'__header__': b'MATLAB 5.0 MAT-file Platform: nt, Created on: Wed Sep 9 16:13:43 2020',
'__version__': '1.0', '__globals__': [], 'key1': array([[0, 1]]), 'key2': array([[3]])}
data3: <class 'dict'> {'__header__': b'MATLAB 5.0 MAT-file Platform: nt, Created on: Wed Sep 9 16:47:59 2020',
'__version__': '1.0', '__globals__': [], 'key1': array([[0, 1]]), 'key2': array([[4]])}
可以发现data2["key2"]被修改为了4,而"__version__"信息无法修改。这个问题考虑是因为带"__*__"是内置信息,类似于私有变量,无法修改。
在1.中可以看到用scipy保存的是"'MATLAB 5.0"版本数据,而v7.3版本的.mat文件是matlab中保存大文件的格式,使用上面的方式是无法读取的,这个时候需要使用h5py,安装如下:
pip install h5py
使用
import h5py
data = h5py.File('data.mat')