np.fromfile返回空ndarray:Python2.7开源GPS代码二进制读取问题排查
解决PyGNSS中
np.fromfile读取.dat二进制文件返回空数组的问题 核心问题回顾
在PyGNSS的update_rawsnippet方法中,通过np.fromfile读取.dat二进制文件到ndarray时返回空数组[],但单独调用np.fromfile能正常读取内容;将datatype从np.dtype([('i', np.int16), ('q', np.int16)])改为np.int8类型后,数组不再为空但读取值错误。已知参数:self.S=2500,使用numpy 1.16.6。
排查与解决步骤
检查文件指针位置
完整代码中,open_rawfile打开文件后,若之前有读取操作未重置指针,会导致指针停在文件末尾,后续np.fromfile无法读取内容(单独测试时是重新打开文件,指针默认在开头,因此能正常读取)。- 修复方式:在
update_rawsnippet读取前,将文件指针定位到正确位置,同时记录当前偏移量避免重复读取:# 重置指针到上次读取的偏移位置(需提前初始化self.current_offset=0) self.rawfile.seek(self.current_offset) rawsnippet = np.fromfile(self.rawfile, dtype=self.datatype, count=self.S) # 更新偏移量为当前指针位置 self.current_offset = self.rawfile.tell()
- 修复方式:在
验证dtype与文件实际格式匹配
改为np.int8后能读取到数据,说明原int16的dtype定义可能与文件实际字节格式不匹配,需重点排查字节序:- 用十六进制工具查看.dat文件头部字节,确认采样数据的字节序(小端/大端),在dtype中明确指定:
# 小端字节序(常见于多数设备输出) self.datatype = np.dtype([('i', '<i2'), ('q', '<i2')]) # 大端字节序 self.datatype = np.dtype([('i', '>i2'), ('q', '>i2')]) - 同时确认文件是否为16位I/Q采样:若实际是8位采样,需调整dtype为
np.int8,并修正后续处理逻辑中的数值范围。
- 用十六进制工具查看.dat文件头部字节,确认采样数据的字节序(小端/大端),在dtype中明确指定:
确认文件打开模式
检查open_rawfile方法是否以二进制模式打开文件,Python2.7中若用文本模式'r'打开,会自动转换换行符,导致字节数读取错误:- 确保打开代码为:
self.rawfile = open(filepath, 'rb')
- 确保打开代码为:
检查count参数对应的字节数
self.S=2500代表读取2500个datatype元素(每个元素含2个int16,共4字节),对应总字节数为10000字节。若文件剩余字节数不足,np.fromfile会返回空数组,需确认文件总大小是否足够,或调整count参数为实际可读取的元素数。
内容的提问来源于stack exchange,提问作者Sergio Vicenzo
相关产品推荐
相关产品推荐

