You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 14:01:04