2011-08-17 53 views
0

我是Python的新手,我得到的列表索引錯誤,當我不應該。 我有以下變量:我一直在Python中得到「列表索引超出範圍」,當列表中有正確的索引

date_array = ['2001','15','1'] 

我可以訪問第一個索引。我只能訪問最後一個索引,如果我嘗試這樣的事:

date_array[-1] 

我得到「列表索引超出範圍」錯誤,每當我嘗試:

date_array[2] 
date_array[1] 

我附上下面的完整代碼供您參考:

import csv 
import datetime 
import re 
marketReader = csv.reader(open('test.csv', 'rb')) 
i=0 

for row in marketReader: 
    cust_id = row[0] 
    date = row[1] # Is a text. Ex: '2002-1-1' 
    spent = row[2] 

    date_array = (re.split('-',date)) # Provides an array ['2002', '1', '1'] 
    year = date_array[0] 
    month = date_array[1] 
    day = date_array[2] 

    # Is weekday? 
    weekday=datetime.date(year,month,day).weekday() 

    if i==200 and row[0]>3 : 
     break 
    pass 
    #print(day) 
    i += 1 

任何幫助將非常感激!這讓我瘋狂!

+0

錯誤出現在哪裏? – agibalov

+4

你確定你len(date_array)總是3嗎?添加支票以確保它是 – nulvinge

+0

您確定CSV文件中的日期格式爲您認爲的格式嗎?你需要使用[dateutil](http://niemeyer.net/python-dateutil)來解析它嗎? – plasticsaber

回答

0

您確定date包含用連字符分隔的日期字符串嗎?如果是的話,這應該工作:

>>> import re 
>>> date_array = (re.split('-',date)) 
>>> date_array 
['2002', '1', '1'] 
>>> date_array[0] 
'2002' 
>>> date_array[1] 
'1' 
>>> date_array[2] 
'1' 

也許你可以添加print date驗證date值是你在想什麼?另外,在回答中包含回溯對我們有幫助。

+0

非常感謝你們!是的,它正是你們說的 - 我認爲一致的數據(即日期總是以正確的格式存在)。謝謝! – bigGreenGrad

+0

@bigGreenGrad,在StackOverflow中,有兩種內置的機制來表達感謝以獲得有用的答案。您可以點擊向上箭頭查看任何有用的答案,並且爲了獲得最佳答案,您可以點擊複選標記以表示您已接受此答案。這當然不是必需的,只是禮貌而已。 –

2

簡單的答案是,date_array並不總是有3個元素。如果您要直接爲列表編制索引,請添加支票以確保長度足夠。

if len(date_array) < 3: 
    print('date_array too short') 
    # do something else 

或替代,包裹索引操作try塊

+0

非常感謝JimB!我認爲我的數據是一致的 - 一個可怕的假設! – bigGreenGrad

+0

program defensively,* always *假設數據不一致:) – JimB

+2

你還認爲Python是錯誤的,那更糟糕;) –

0

如果你有正確的索引Python的永遠不會抱怨。如果它抱怨,這是錯誤的。這是簡單。

現在弄清楚爲什麼列表太短。你可以打印出陣列,並立即看到什麼是錯的。

相關問題