2016-04-26 24 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