使用numpy.genfromtxt读取CSV指定列时触发ValueError(获取3列而非1列)的问题咨询
解决numpy.genfromtxt读取CSV指定列时的ValueError问题
我碰到过类似的情况,咱们一步步来拆解问题:
首先,你报错的ValueError: got 3 columns instead of 1意思很明确:当读取第4列(索引3,因为numpy是0开始计数)时,某一行只有3个字段,根本找不到第4个列,所以触发了错误。而读取索引1(第二列)和索引2(第三列)时没问题,说明这两个列在所有行里都存在。
问题根源排查
你可以先手动验证CSV文件的格式:
- 打开
AOM_8.csv,直接跳到第10行(因为skip_header=9会跳过前9行),检查每一行是不是都有3个逗号(也就是分成4列)。大概率是某一行少了一个逗号,或者末尾的字段为空且没保留逗号,导致该行被解析成3列。 - 比如某一行写成了
10,0.0001,4.0225493而不是10,0.0001,4.0225493,6.1053924,这样genfromtxt就会把它识别成3列,读取索引3时自然报错。
快速定位异常行的代码
用这段代码可以自动扫描所有行的字段数,快速找到出问题的行:
import numpy as np import os file = 'E:/TPA/AOM_8.csv' file = os.path.normpath(file) # 读取所有行,保留原始格式,查看每行的字段数 raw_data = np.genfromtxt(file, delimiter=',', skip_header=9, dtype=None, encoding='utf-8') for idx, row in enumerate(raw_data): print(f"第{idx+1}行(跳过前9行后)的字段数:{len(row)}")
运行后就能看到哪一行的字段数不是4,找到后去CSV里修正格式即可。
临时替代方案(不推荐长期使用)
如果暂时没法修改CSV文件,可以让genfromtxt跳过异常行,同时用缺失值填充:
y = np.genfromtxt(file, delimiter=',', usecols=3, skip_header=9, invalid_raise=False, filling_values=np.nan)
不过这个方案会丢失异常行的数据,还是优先修正CSV格式更稳妥。
另外再确认一句:你设置的usecols=3是对的(对应Data collector2列),问题核心还是CSV文件的行格式不一致。
内容的提问来源于stack exchange,提问作者Madmem
相关产品推荐
相关产品推荐

