如何用Python读取MATLAB生成的16位有符号整数.pmt.dat二进制文件?
问题分析与解决方案
你犯了几个核心错误,导致读取结果完全不符合预期:
- 你用文本模式(
'r')打开了二进制文件,原始二进制数据并非文本格式,必须使用二进制模式('rb')打开才能正确读取字节流。 - 错误指定了
encoding='utf-16-le'参数:你的文件是16位有符号整数的原始二进制流,不是经过UTF-16编码的文本,编码参数在这里完全不适用,只会导致字节被错误解析为文本字符,出现乱码。 - 使用
readlines()方法:这是用来按行读取文本内容的函数,对二进制样本数据完全不匹配,它会把二进制字节强行按文本换行符分割,得到的结果自然和预期相差甚远。
正确读取方案(优先推荐Numpy,适配Anaconda环境)
因为你使用Anaconda环境,Numpy已经默认安装,用它读取这种原始二进制效率最高:
import numpy as np # 直接从二进制文件读取并解析为16位有符号整数数组 data = np.fromfile('filename_00001.pmt.dat', dtype=np.int16) # 查看数组形状,按你描述的1通道12500样本,应该输出 (12500,) print(f"读取到的元素数:{len(data)}")
关于你提到的“期望25000个元素”的说明
12500个16位有符号整数对应的字节数是25000(每个int16占2字节),如果你确实需要25000个元素的数组,可能是想将每个16位整数拆分为单个字节,可以这样处理:
# 将int16数组转换为字节数组,再解析为uint8类型的数组 byte_array = np.frombuffer(data.tobytes(), dtype=np.uint8) print(f"字节数组元素数:{len(byte_array)}") # 输出25000
不用Numpy的替代方案(使用struct模块)
如果不想依赖Numpy,可以用Python标准库的struct模块手动解析:
import struct with open('filename_00001.pmt.dat', 'rb') as f: # 读取所有二进制字节 raw_bytes = f.read() # 计算样本数:总字节数 ÷ 2(每个int16占2字节) sample_count = len(raw_bytes) // 2 # 按小端字节序解析为16位有符号整数(Windows下MATLAB默认小端,若结果异常可改为'>h'大端) data = struct.unpack(f'<{sample_count}h', raw_bytes) # 转成列表方便处理 data_list = list(data) print(f"读取到的元素数:{len(data_list)}")
内容的提问来源于stack exchange,提问作者dcupolillo
相关产品推荐
相关产品推荐

