scipy loadmat加载含扩展ASCII字符的Matlab文件问题求助
解决scipy.loadmat无法加载含扩展ASCII字符的Matlab文件问题
以下几种方法可处理这类场景:
方法一:指定编码并处理解码错误
scipy.loadmat支持通过encoding参数指定字符编码,扩展ASCII字符可尝试用latin1编码加载。若仍出现解码报错,可结合底层读取逻辑手动替换无法识别的字符:
from scipy.io import loadmat # 优先尝试用latin1编码加载 try: mat_data = loadmat("your_file.mat", encoding="latin1") except UnicodeDecodeError: # 用h5py底层读取并处理字符串 import h5py def process_data(obj): if isinstance(obj, h5py.Dataset) and obj.dtype.kind in ("S", "U"): # 解码时将无法识别的字符替换为? return obj[()].decode("latin1", errors="replace").replace("\x00", "") elif isinstance(obj, h5py.Group): return {k: process_data(v) for k, v in obj.items()} else: return obj[()] with h5py.File("your_file.mat", "r") as f: mat_data = process_data(f)
方法二:借助Octave转存为兼容格式
既然Octave能正常加载文件,可编写一段Octave脚本,将原文件转存为HDF5格式的.mat文件(v7.3版本),该格式对字符兼容性更强,scipy和h5py均可稳定加载:
% Octave脚本:转存为兼容格式 raw_data = load("your_file.mat"); save("compatible_file.mat", "-v7.3", "-struct", "raw_data");
之后在Python中直接加载转存后的文件:
from scipy.io import loadmat mat_data = loadmat("compatible_file.mat", encoding="utf-8")
方法三:二进制预处理文件
若文件中存在个别违规字节导致加载失败,可直接以二进制方式读取文件,将无法识别的字节替换为?(ASCII码0x3F),保存为新文件后再加载:
# 二进制读取并替换违规字节 with open("your_file.mat", "rb") as f_in: binary_content = f_in.read() # 替换非标准ASCII字节为?,可根据实际情况调整匹配规则 processed_content = binary_content.replace(b"\xff", b"?") # 示例替换0xff为? with open("processed_file.mat", "wb") as f_out: f_out.write(processed_content) # 加载处理后的文件 mat_data = loadmat("processed_file.mat", encoding="latin1")
内容的提问来源于stack exchange,提问作者dave
相关产品推荐
相关产品推荐

