numpy.genfromtxt设置deletechars='/'首列仍生成默认列名问题咨询
问题原因分析
你对deletechars参数的理解存在偏差,这个参数的作用是在完成表头字段拆分后,删除每个列名字符串中包含的指定字符,不会修改原始表头的结构,也不会跳过行首的特定字符。
你遇到的问题根源:
- 表头行以
/开头,numpy拆分表头字段时会把/识别为第一个列名,导致表头总字段数比实际数据的列数多1,触发「Header Information does not match array」报错 - 后续
deletechars="/"会把第一个列名的/删除,得到空列名,numpy会自动将空列名替换为f0,就出现了你看到的输出结果
解决方法
方法1:手动指定列名(最稳妥)
直接预定义表头字段列表,读取时跳过原始表头行即可,注意调整usecols的索引(因为去掉了多余的第一个表头字段,原有索引需要全部减1):
# 预定义列名(已去掉开头的/) col_names = ["Line", "Aircraft", "Flight", "Date", "JulL", "Time", "DateU", "TimeU", "Zn", "Easting", "Northing", "Lat", "Long", "xTrack", "ZFid_ms", "KFid", "AFid", "TFRAWT", "TFUNCT", "Mag4D", "VecX", "VecY", "VecZ", "VecTF", "MagRatio", "GPSHt", "Undul", "Sats", "HDop", "DGPS", "RadAlt", "BaroHPa", "Temp", "Humid", "CurrAmps", "Dn", "Up", "Samp", "Live", "RawTC", "RawK", "RawU", "RawTh", "Cosm", "LRange", "LStr", "LErr"] # 跳过原始表头行,使用自定义列名 data = np.genfromtxt(filename, skip_header=1, usecols=(0,17,19,20,21,22), invalid_raise=False, names=col_names, dtype=None)
方法2:预处理表头去除行首/
先读取文件内容,删除表头开头的/后再传给genfromtxt解析,不需要调整usecols索引:
from io import StringIO with open(filename, 'r', encoding='utf-8') as f: content = f.read() # 仅删除第一行开头的/ processed_content = content.lstrip('/') data = np.genfromtxt(StringIO(processed_content), usecols=(0,18,20,21,22,23), invalid_raise=False, names=True, dtype=None)
内容的提问来源于stack exchange,提问作者AndrewTaylor
相关产品推荐
相关产品推荐

