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
相关产品推荐
相关产品推荐

