You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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转置调整成我们习惯的行优先结构。

你可以根据自己的实际情况选其中一种,亲测都能解决你遇到的问题~

火山引擎 最新活动