使用Scipy加载.mat文件时出现TypeError错误求助
解决.mat文件加载报错:TypeError: Expecting miMATRIX type here
问题背景
我有一个.mat文件,内部存储的是一个Python字典,包含以下键:
- "dt":仿真的时间步长
- "x":网格每个点的x坐标矩阵
- "y":网格每个点的y坐标矩阵
- "u":各时刻网格点的纵向速度三维数组
- "v":各时刻网格点的垂直速度三维数组
尝试用scipy.io.loadmat加载文件,代码如下:
from scipy.io import loadmat data = loadmat('/Users/simograbzi/PythonProjects/wake_Re500.mat') print(data)
运行后出现报错:
File ~/PythonProjects/untitled0.py:10 in <module> data = loadmat('/Users/simograbzi/PythonProjects/wake_Re500.mat') File ~/opt/anaconda3/lib/python3.9/site-packages/scipy/io/matlab/mio.py:226 in loadmat matfile_dict = MR.get_variables(variable_names) File ~/opt/anaconda3/lib/python3.9/site-packages/scipy/io/matlab/mio5.py:312 in get_variables hdr, next_position = self.read_var_header() File ~/opt/anaconda3/lib/python3.9/site-packages/scipy/io/matlab/mio5.py:271 in read_var_header raise TypeError('Expecting miMATRIX type here, got %d' % mdtype) TypeError: Expecting miMATRIX type here, got 825375027
解决方法
这个报错的核心原因是:你要加载的.mat文件并非标准MATLAB格式,而是用Python序列化工具(比如pickle)保存的字典,scipy.io.loadmat仅支持标准MATLAB生成的.mat文件,无法识别这种非标准格式。
尝试以下几种方案:
方案1:用pickle加载
如果文件是用Python的pickle保存的,直接用pickle读取:
import pickle # 以二进制只读模式打开文件 with open('/Users/simograbzi/PythonProjects/wake_Re500.mat', 'rb') as f: data = pickle.load(f) # 验证加载结果 print(data.keys())
方案2:用numpy加载
如果文件是用numpy.save保存的,使用numpy加载并转换为字典:
import numpy as np data = np.load('/Users/simograbzi/PythonProjects/wake_Re500.mat', allow_pickle=True).item() print(data.keys())
方案3:确认文件类型
可以通过终端命令查看文件的实际类型,判断用哪种工具加载:
file /Users/simograbzi/PythonProjects/wake_Re500.mat
如果输出包含Python pickle,则用方案1;如果是NumPy data file,则用方案2。
内容的提问来源于stack exchange,提问作者simogbz
相关产品推荐
相关产品推荐

