2016-04-26 53 views
1

我目前正在处理~60-70 MB csv文件的脚本。首先,我从一个标签文件翻译csv文件(不需要,但不管这里是什么问题)。在下一步中,我通过csv的行来做两件事:
1)检查第二列中的值。如果此值自上一行以来已更改,请创建一个新的输出文件。
2)将当前行的某些列值传输到输出文件。 我有几个脚本自动执行的选项卡文件。它对大多数人来说工作正常,但有时我得到一个... ...处理“大”csv文件时接收看似随机的IndexErrors

IndexError: list index out of range  

...没有明显的原因。我查看了它正在分裂的csv文件,错误前后的行看起来也是一样的。

我试着通过尝试/除了outputWriter至少有一些错误(这已经不是最理想的,因为我不想丢失数据)工作。但是,我从另一行处理索引变量的代码中得到相同的错误。

给你举一个例子,这里是最后三行在我的输出文件中的脚本停止前:

154881105,-0.293776585182967 
154883302,0.168302231277491 
154883397,0.175177022786097 

这里有相应的线路是从阅读加上一个应该一直在旁边:

87018,23,154881105,-0.293776585182967 
87019,23,154883302,0.168302231277491 
87020,23,154883397,0.175177022786097 
87021,23,154883513,0.949924732250711 

我错过了什么吗?我没有看到任何理由为什么指数应该超出范围。

最后,这里是我的代码的部分,应该是相关的:

 with open (newCsv, 'rU') as csvfile: 

     plotlist = csv.reader(csvfile, delimiter=',', dialect=csv.excel_tab) 

     x = 0 

     for i, row in enumerate(plotlist): 

      if is_number(row[1]): 

       if row[1] != x: 
        x = row[1] 
        fileName = "sample" + str(x) + ".csv" 
        outputFile = open(fileName, "w") 
        outputWriter = csv.writer(outputFile) 
        outputWriter.writerow(["y","x"]) 

       outputWriter.writerow([row[2], row[3]]) 

任何人有任何想法,这是怎么回事错在这里?

+1

公司发行的最后调试之前而发出'writerow'打印整行,并告诉输出。 – ALH

+1

例如:'如果len(row)<= 3:print'这就是!' – ALH

回答

1

这些行只有2个项目:但是你正在使用索引[3]。超出范围。

+0

确实,我遵循了Alireza的建议,那些行显然只有2或者下一个,甚至只有1个项目。但为什么? – fakechek

+0

我怎么知道? – ABuckau

1

下面的错误明确地告诉你,为确保你能获得一个指数,这是不是在列表中实际存在的(?):

IndexError: list index out of range  

因此,对于更好的调试,你可以跟踪一步错误之前的步骤:

if len(row)<=3: 
    print "Here's the culprit: %s" % row 

你几乎会看到的是由上面的代码:)

+0

是的,我可以看到,造成错误的行只携带1或2个项目。现在我需要弄清楚为什么,因为这条线明显由4个元素组成,分隔为“,” – fakechek