Python批量处理Matlab文件:从键名可变的字典提取目标数据
批量读取Matlab文件并提取目标数据
核心思路
每个.mat文件加载后生成的字典中,除了固定的三个默认键(__header__、__version__、__globals__),剩下的就是你需要的目标数据键。可以通过过滤默认键,或者结合文件名规律来精准定位目标键。
方案一:过滤默认键(通用场景)
适用于每个文件仅包含一个非默认键的情况,代码示例:
import scipy.io import glob import numpy as np # 定义要排除的默认键集合 default_keys = {'__header__', '__version__', '__globals__'} all_data = [] # 遍历目录下所有.mat文件 for mat_file in glob.glob('/content/*.mat'): mat_dict = scipy.io.loadmat(mat_file) # 筛选出非默认键 target_keys = [key for key in mat_dict if key not in default_keys] # 提取目标数据(每个文件仅一个目标键,取第一个即可) data = mat_dict[target_keys[0]] all_data.append(data) # 转换为numpy数组(若数据维度一致可直接转换,否则保持列表) all_data_array = np.array(all_data)
方案二:结合文件名匹配键(更精准)
如果文件名和目标键存在对应规律(比如文件名含DE则键也含DE),可以用这种方法避免多键冲突:
import scipy.io import glob import numpy as np all_data = [] for mat_file in glob.glob('/content/*.mat'): mat_dict = scipy.io.loadmat(mat_file) # 从文件名提取特征标识(如DE/FE) file_basename = mat_file.split('/')[-1] # 根据标识匹配目标键 if 'DE' in file_basename: target_key = [k for k in mat_dict if 'DE' in k][0] elif 'FE' in file_basename: target_key = [k for k in mat_dict if 'FE' in k][0] else: # 处理其他无明确标识的文件 target_key = [k for k in mat_dict if k not in {'__header__', '__version__', '__globals__'}][0] # 提取数据 data = mat_dict[target_key] all_data.append(data)
注意事项
- 如果存在文件包含多个非默认键的情况,需要先检查
len(target_keys),避免索引报错。 - 若各文件的数据维度不一致,直接转numpy数组会生成object类型数组,此时建议保持列表格式,或统一数据形状后再转换。
内容的提问来源于stack exchange,提问作者Tam
相关产品推荐
相关产品推荐

