如何在Python中访问MATLAB .mat文件中的所有嵌套结构体?
解决.mat大文件嵌套结构体的部分读取问题
方法1:用scipy的MatFile懒加载读取
scipy的MatFile类支持按需读取结构体成员,不会一次性加载整个大文件。代码示例:
from scipy.io import matlab with matlab.MatFile('/path/to/your/file.mat') as mat_file: # 仅获取外层结构体对象(不加载全部数据) struct1 = mat_file['struct1'] # 读取第一层成员 member1 = struct1['member1'] # 读取嵌套的子成员 member2 = struct1['member2'] target_data = member2['data1'] # 如果需要转为numpy数组,再执行转换 target_data_np = target_data[()]
这个方式的核心是懒加载,只有当你访问具体成员时,才会从文件中读取对应的数据块。
方法2:用h5py直接操作(适用于MATLAB 7.3及以上版本的.mat文件)
如果你的.mat文件是MATLAB 7.3或更高版本保存的(本质是HDF5格式),可以用h5py直接按路径访问嵌套结构:
import h5py with h5py.File('/path/to/your/file.mat', 'r') as h5_file: # 直接通过层级路径访问目标数据 target_data = h5_file['struct1']['member2']['data1'] # 转为numpy数组(按需执行) target_data_np = target_data[()]
HDF5格式的.mat文件会将结构体组织为嵌套的分组,h5py可以精准定位到你需要的子数据,完全不需要加载无关内容。
方法3:用MATLAB预处理(如果有MATLAB环境)
如果能使用MATLAB,最直接的方式是提前提取需要的子结构,保存为小文件:
% 仅加载外层结构体 load('large_file.mat', 'struct1'); % 提取目标子数据 target_data = struct1.member2.data1; % 保存为独立小文件 save('target_data.mat', 'target_data');
之后直接读取这个小文件即可,彻底避开大文件的嵌套读取问题。
内容的提问来源于stack exchange,提问作者Pablo Tarodo
相关产品推荐
相关产品推荐

