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

Python读取.mat文件失败:scipy.io与h5py两种方法均未成功

解决Matlab Dataset对象在Python中读取失败的问题

我之前也踩过这个坑——你遇到的核心问题是:rateQualityOutTrim是Matlab的dataset类型对象(属于MCOS,即Matlab面向对象系统),而scipy.io和h5py默认只能读取Matlab里的普通数组、矩阵或结构体,没法自动解析这种封装的面向对象数据。下面给你两种可行的解决方案:

方案1:从Matlab端转换为兼容格式(最推荐)

直接在Matlab里把dataset对象转成普通的table或矩阵,再保存,这样Python就能轻松读取:

Matlab端代码

% 将dataset对象转换为table(如果是表格型数据)
converted_data = table(rateQualityOutTrim);
% 保存为scipy兼容的v7版本
save('path/converted_data.mat', 'converted_data', '-v7');

Python端代码

import scipy.io as sio
import pandas as pd

# 读取转换后的mat文件
mat = sio.loadmat('path/converted_data.mat')
# 直接转成DataFrame
df = pd.DataFrame(mat['converted_data'])

方案2:Python端直接解析MatlabOpaque对象

如果没法修改Matlab的保存流程,那我们可以手动解析scipy返回的MatlabOpaque对象:

Python代码

import scipy.io as sio
import pandas as pd
from scipy.io.matlab import mat_struct

# 加载文件时开启结构体解析选项
mat = sio.loadmat('path/tmpPBworkspace.mat', struct_as_record=False, squeeze_me=True)

# 获取Opaque对象
opaque_obj = mat['None']
# 查看对象的所有属性(找到存储实际数据的字段)
print(dir(opaque_obj))

# 通常dataset的实际数据会存在类似`data`或`Values`的属性里,比如:
df = pd.DataFrame(opaque_obj.data)

方案3:用h5py解析v7.3格式文件

你之前用h5py时路径不对,v7.3格式里MCOS对象的存储结构嵌套更深,得先遍历文件结构找到数据:

Python代码

import h5py
import numpy as np
import pandas as pd

f = h5py.File('path/tmpPBworkspaceH5.mat','r')

# 先查看文件里的所有顶层节点
print("顶层节点:", list(f.keys()))
# 查看rateQualityOutTrim下的子节点
print("rateQualityOutTrim子节点:", list(f['rateQualityOutTrim'].keys()))

# 实际数据通常在`Properties`或`data`这类子组里,比如:
data_group = f['rateQualityOutTrim']['data']
# 转换为数组再转DataFrame
data_array = np.array(data_group)
df = pd.DataFrame(data_array)

关键说明

为什么之前的方法失败?

  • 方法1中scipy返回的MatlabOpaque就是对Matlab对象的原始封装,它不会自动解析对象内部的业务数据;
  • 方法2中你直接访问rateQualityOutTrim/date是错误的,因为dataset对象的存储路径不是这么简单的,需要先遍历节点找到实际数据所在的位置。

内容的提问来源于stack exchange,提问作者SBad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:13:10