使用numpy.fromfile读取固定宽度二进制文件时如何直接加载为字符串类型
实现方法
你不需要逐行读取转换,只需要调整自定义dtype里字符串字段的类型定义,就能让np.fromfile直接把定长8字节字段识别为字符串类型,且完全不增加读取开销、不会出现字段偏移错误:
- 把原来字符串字段的
np.byte, 8替换为'S8'即可,S是numpy定长字节串的类型标识,后面跟的数字代表字段占用的字节长度,和你文件里的8字节定长字符串存储完全匹配:
import numpy as np # 定义匹配存储结构的dtype myDatatype = np.dtype([ ('mynumber', np.int32), ('mystring', 'S8') ]) # 执行读取 data = np.fromfile(f, myDatatype)
读取完成后,data['mystring']会直接返回定长字节串数组,而不是原来的int8数值数组。如果需要转为Python常用的Unicode字符串,可以批量做一次解码,操作是向量化的,速度远快于逐行处理:
# 按你的文本实际编码替换encoding参数,常用编码为ascii/utf-8/gbk data['mystring'] = np.char.decode(data['mystring'], encoding='utf-8')
注意:不要直接使用
'U8'(定长Unicode类型)定义字段,U类型每个字符占4字节,U8总长度为32字节,会和你文件里8字节的存储长度不匹配,导致所有字段读取错位。
你可以通过myDatatype.itemsize验证结构对齐性:上述定义的dtype单条记录长度为4+8=12字节,和你文件里重复单元的长度完全一致,不会出现读取错位问题。
内容的提问来源于stack exchange,提问作者Stein
相关产品推荐
相关产品推荐

