如何在Python中正确读取包含Table对象的Matlab v7.3版本.mat文件?
如何在Python中正确读取包含Table对象的Matlab v7.3版本.mat文件?
我太懂你这种头疼的感觉了——Matlab v7.3格式的.mat文件里的Table对象确实是个小坑,像你用mat73直接读会返回None还提示不支持table类型,这是因为大部分Python库都没专门做Matlab Table结构的解析适配。我给你两个亲测有效的解决办法,你可以按需选:
方法一:用h5py手动解析HDF5结构(不用改Matlab代码)
Matlab v7.3本质是HDF5格式,Table在里面是以复杂组结构存储的,我们可以直接用h5py拆出来组装成Python常用的DataFrame:
import h5py import pandas as pd # 打开mat文件 with h5py.File('test_table_73.mat', 'r') as f: # 定位到Table对应的组 table_group = f['test_table'] # 读取列名(Matlab的字符串是字节格式,需要解码成普通字符串) var_names = [name.decode('utf-8') for name in table_group['VariableNames'][0]] # 逐个提取每一列的数据 table_data = {} for idx, col_name in enumerate(var_names): # 读取列数据,Matlab是列优先存储,这里转成一维数组 col_values = table_group['Variables'][idx][:].flatten() table_data[col_name] = col_values # 组装成DataFrame,和Matlab里的Table结构完全对应 result_df = pd.DataFrame(table_data) print(result_df)
运行这段代码后,你就能得到和Matlab里一模一样的表格数据了,列名和数值都不会错。
方法二:先在Matlab里把Table转成通用格式再保存(更省心)
如果能修改Matlab的保存逻辑,直接把Table转成Python更好兼容的结构体或数组,读取起来会简单很多:
修改后的Matlab代码
test_table = table([1, 2]', [3, 4]', VariableNames={'a', 'b'}); % 把Table转成结构体(保留列名) test_struct = table2struct(test_table); % 保存成v7.3格式 save("test_table_73.mat", "test_struct", "-v7.3");
对应的Python读取代码
import mat73 import pandas as pd data_73 = mat73.loadmat("test_table_73.mat") # 把结构体转成DataFrame result_df = pd.DataFrame(data_73['test_struct']) print(result_df)
这种方法相当于提前在Matlab里“做了适配”,Python端不用处理复杂的解析逻辑,新手也能快速搞定。
小提醒
- 如果你只需要Table里的数值不需要列名,也可以在Matlab里用
table2array转成普通数组再保存,Python读取后直接就是numpy数组,更简单。 - 用h5py的时候要注意,Matlab的数组是列优先存储的,所以读取后记得用
flatten()或者T转置调整成我们习惯的行优先结构。
你可以根据自己的实际情况选其中一种,亲测都能解决你遇到的问题~




