『Python动手学』Python处理.mat文件

时间:2022-07-24
本文章向大家介绍『Python动手学』Python处理.mat文件,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

0.引子

最近笔者在处理数据时,遇到.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]])}

1.实战

在Python中,需要通过scipy来操作.mat文件。首先如未安装,请执行:

pip install scipy

操作一:保存mat文件

import scipy.io as sio

data1 = {
    "key1":[0,1],
    "key2":3
        }

sio.savemat("save.mat",data1)

此时可以发现当前文件夹下面多了一个"save.mat"文件

操作二:读取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:songCodesface_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:songCodesface_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__"信息无法修改。这个问题考虑是因为带"__*__"是内置信息,类似于私有变量,无法修改。

2.补充

在1.中可以看到用scipy保存的是"'MATLAB 5.0"版本数据,而v7.3版本的.mat文件是matlab中保存大文件的格式,使用上面的方式是无法读取的,这个时候需要使用h5py,安装如下:

pip install h5py

使用

import h5py 

data = h5py.File('data.mat')

-1.参考

-10:https://blog.csdn.net/GYGuo95/article/details/79537640