You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 18:12:52