Numpy genfromtxt错误:获得额外的列而不是n个

时间:2014-02-19 18:11:36

标签: python python-2.7 csv python-3.x numpy

import glob
import os
from numpy import genfromtxt

def main():
    path = os.path.expanduser('~/Desktop/InternshipWorks/Chhattisgarh')
    os.chdir(path)
    for file in glob.glob("*.csv"):
        print "Filename = ", file
        my_data = genfromtxt(file, delimiter = ',', dtype = str)
        print "Data Received" 
        Bindex, Iindex = 0, 0
        for j in range(len(my_data[0])):
            if Bindex == 0 and my_data[0,j] == 'B':
                Bindex = j
            if Iindex == 0 and my_data[0,j] == 'I':
                Iindex = j

if 1:
    main()

使用此代码使用numpy中的genfromtxt读取csv文件时出现以下错误:

Traceback (most recent call last):
  File "readcsvTest.py", line 22, in <module>
    main()
  File "readcsvTest.py", line 10, in main
    my_data = genfromtxt(file, delimiter = ',', dtype = str)
  File "/usr/lib/python2.7/dist-packages/numpy/lib/npyio.py", line 1593, in genfromtxt
    raise ValueError(errmsg)
ValueError: Some errors were detected !
    Line #3 (got 15 columns instead of 14)
    Line #4 (got 15 columns instead of 14)

我交叉检查了csv文件,但它不包含任何此类相关错误。

2 个答案:

答案 0 :(得分:0)

图片仍然无效,但由于我们在评论中进行了(不幸的)扩展讨论,因此我正在寻求答案。

当你调用genfromtxt时,numpy假定每一行的列数与文件中的第一行相同。所以问题可能出在标题行中,因为你有比预期更多的列,或者在下面的数据行中,你有更少的列。

问题几乎可以肯定是文件的前四行之一无法导入。您可以采取一些措施进行故障排除。

首先,仔细查看失败文件中的第1,2,3和4行。有没有多余的逗号?你期望有14列或15列吗?任何特殊字符,如#,\,/或*?

如果您确实没有看到任何内容,请尝试为genfromtxt导入构建一个dtype。该类型将强制genfromtxt确保数据是您想要的方式。例如,如果您有15列,所有列都填充了长度小于40个字符的字符串,则您的dtype将为:

dt_str = ", ".join("S40")    
dt = np.dtype(dt_str)

然后使用带有dtype参数的genfromtxt:

my_data = genfromtxt(file, delimiter = ',', dtype = dt)

这应该告诉您文件中的哪一行在错误消息中的列数错误。然后密切关注那一行,你应该能够找到问题。

此外,从截图中看起来您正在电子表格编辑器中打开csv。我觉得打开原始文本来解决这类问题很有用。因此,使用记事本或其他东西来检查每个相关的行。

答案 1 :(得分:0)

我遇到了同样的问题,对于我来说,除了标题栏之外的每一列都有一个额外的'\ t'(标签)。不幸的是,这来自另一个我无法改变的软件(Xilinx Chipscope ASCII / .prn导出文件)。它给了我错误:

Line #2 (got 67 columns instead of 66)
...
Line #4095 (got 67 columns instead of 66)
Line #4096 (got 67 columns instead of 66)
Line #4097 (got 67 columns instead of 66)

我最初的命令是:

X = np.genfromtxt(source, delimiter='\t', names=True)

我尝试了很多,最后我的解决方案变成了以下内容:

with open(source, 'rb') as fh:
  csvreader = csv.reader(fh, delimiter='\t')
  fNames = csvreader.next()

X = np.genfromtxt(source, delimiter='\t', names=','.join(fNames), skip_header=1)

使用genfromtxt似乎有点麻烦,而只使用csv.reader可能更干净/更好。但是当我开始尝试时,当我想生成结构化数组时,我遇到了太多的初始麻烦,所以我没有进一步考虑它

其他信息:

(因为chipcope关键字可能会找到这篇文章的人)

我将第一个之后的每个列从十六进制字符串转换为整数并将其转换为float。 为此,我必须在genfromtxt之前另外执行此操作,因为它不允许您为一系列列定义转换器:

conv_dict = { }
for i in range(1, len(fNames)):
  conv_dict[i] = lambda s: float( int(str(s), 16) )

然后以这种方式调用genfromtxt:

X = np.genfromtxt(source, delimiter='\t', names=','.join(fNames), skip_header=1, converters=conv_dict)