scipy.io加载.mat文件报KeyError:'data'的解决方法咨询
问题根因
你加载的.mat文件本身就不存在名为data的变量,和你用什么Python加载库没有关系。
从mat_contents.keys()返回的__function_workspace__、None两个特殊键可以直接判定:你手头所有测试用的.mat文件,都是MATLAB保存函数运行时临时工作区生成的特殊快照文件,不是常规存储基础工作区自定义变量的标准mat文件,换scipy、mat4py、mat73还是mat2py都不可能读得到文件里根本没存的键。
另外你贴的代码还有个显性笔误:开头导入写的是import scipy as sp,后面调用却写scipy.io.loadmat,直接运行会先触发NameError,记得修正导入逻辑。
修复步骤
先排查MATLAB端的文件存储问题(核心,跳过这步Python端怎么调都没用)
不用在Python端反复换库试错,先打开MATLAB做校验:
- 切换到mat文件所在目录,命令行执行
whos('-file', '你的文件名.mat'),直接列出文件内实际存储的所有变量名、维度、类型 - 如果返回结果里找不到
data:说明你之前存文件的操作完全错误- 如果你是在函数执行过程中点工作区的「保存」按钮,存进去的只有函数内部的临时变量,你要的基础工作区里的
data根本没被写入文件 - 正确存法:回到MATLAB基础命令行工作区,确认工作区浏览器里能看到
data变量后,执行save('target.mat', 'data', '-v7')保存为v7版本mat文件,scipy对这个版本的兼容性最好,不会出现格式适配问题
- 如果你是在函数执行过程中点工作区的「保存」按钮,存进去的只有函数内部的临时变量,你要的基础工作区里的
- 如果
whos能查到data,检查变量名是否有大小写偏差、是否带不可见的特殊字符
Python端正确加载代码
修正导入笔误,加载后先校验键名,不要硬编码data去索引:
from scipy import io import os work_dir = r"你的mat文件存储目录" os.chdir(work_dir) # 加squeeze_me=True可以自动剔除冗余的数组嵌套,读取结果更易处理 mat_content = io.loadmat("你的文件名.mat", squeeze_me=True) # 过滤掉系统自带键,打印实际存储的变量 valid_keys = [k for k in mat_content.keys() if not k.startswith("__")] print("文件内有效变量名:", valid_keys) # 再按打印出来的实际变量名索引取值
v7.3格式mat文件的读取方案
如果MATLAB端确认存的是v7.3格式(本质是HDF5格式文件,scipy不支持),直接用h5py读取即可,不需要试各类小众第三方加载库:
import h5py import os os.chdir(r"你的mat文件存储目录") with h5py.File("你的文件名.mat", "r") as f: print("文件内有效键:", list(f.keys())) data = f["data"][()]
只要你加载任意mat文件都返回
dict_keys(['__header__', '__version__', '__globals__', 'None', '__function_workspace__'])这组固定键,就可以100%确定所有测试文件都是错误保存的函数工作区快照,和Python端逻辑、加载库没有任何关系,回MATLAB端按正确方式重新存变量即可解决。
内容的提问来源于stack exchange,提问作者StandingSpeaker
相关产品推荐
相关产品推荐

