使用Python将Excel提取数据写入.mat文件时数据损坏如何解决
解决方案
问题根因定位
- 最常见原因是pandas导出的numpy数组为
object类型(存在混合数据类型/未识别的空值),scipy.io.savemat对object类型数组支持度极低,极易生成损坏的.mat文件 - 其次可能是savemat默认导出的MAT文件版本与你使用的MATLAB版本不兼容
- 小概率是数组中存在未处理的空值、字符串类型内容无法被MATLAB识别
修复后的实现代码
import pandas as pd import numpy as np import scipy.io import os # 读取Excel文件 file_location = '/Users/manmohidake/GoogleDrive/Post_doc/Trial_analysis/1_IndoorOutdoor.xlsx' mydata = pd.read_excel( file_location, na_values="Missing", sheet_name='Sheet1', skiprows=1, usecols="F,K,Q" ) # 1. 强制转换为数值类型,无法转换的内容设为NaN mydata = mydata.apply(pd.to_numeric, errors='coerce') # 2. 可选:如果不需要保留空值,可以统一填充为指定值,比如0 # mydata = mydata.fillna(0) # 转换为float类型的numpy数组,避免object类型 array = mydata.to_numpy(dtype=np.float64) # 导出.mat文件,指定兼容格式 destination_folder_path = '/Users/manmohidake/Google Drive/Post_doc/Trial_analysis/' scipy.io.savemat( os.path.join(destination_folder_path, 'trial1.mat'), {'array': array}, appendmat=False, # MATLAB版本高于R2006b用format='5'即可,需要支持超大数组可改为'7.3' format='5' )
验证步骤
- 导出前先打印
array.dtype确认输出为float64而非object - 导出后可以先用scipy的
loadmat接口本地验证文件是否正常:
test_load = scipy.io.loadmat(os.path.join(destination_folder_path, 'trial1.mat')) print(test_load['array'])
如果本地可以正常读取,说明文件无损坏,可直接在MATLAB中打开。
内容的提问来源于stack exchange,提问作者MoD
相关产品推荐
相关产品推荐

