2011-11-28 220 views
15

我有一個簡單的for循環,即使異常塊包含continue也會異常退出。當它遇到IndexError並退出for循環時,仍有大約10行要讀取。我在這裏錯過了什麼?Python:繼續迭代for循環異常

for row in hkx: ##'hkx' are rows being read in from 'csv.open' 
    try: 
     print row[2],row[4] 
    except IndexError, e: 
     print 'Error:',e 
     print 'Row Data:',len(row),row 
     continue ## I thought this would just move on to the next row in 'hkx' 

(不好意思,總Python的新手在這裏...) 提前感謝!

+11

它應該工作,你確定沒有另一個異常(不僅是IndexError)引發? –

+1

@Nathan:您可以發佈一個完整的最簡單的例子嗎? –

+1

同意@CédricJulien - 你可能會發布輸出嗎? – Marcin

回答

8

它完全按照它應該的和繼續下一行。如果一個異常提前終止你的代碼,那麼它必須不是IndexError,或者它必須從try:塊之外的某些代碼中拋出。

>>> hkx = [ range(5), range(4), range(4), range(5) ] 
>>> for row in hkx: ##'hkx' are rows being read in from 'csv.open' 
    try: 
     print row[2],row[4] 
    except IndexError, e: 
     print 'Error:',e 
     print 'Row Data:',len(row),row 
     continue ## I thought this would just move on to the next row in 'hkx' 

2 4 
2 Error: list index out of range 
Row Data: 4 [0, 1, 2, 3] 
2 Error: list index out of range 
Row Data: 4 [0, 1, 2, 3] 
2 4 
>>> 

注意,如果該行至少包含3個項目,你會得到一半的打印輸出,如果你使用一個格式字符串,你就可以避免。 (例如print "{} {}".format(row[2],row[4])

你還沒有說過hkx是如何定義的,只是它來自csv.open。如果它是一個生成器而不是一個簡單的列表,那麼它可能只是迭代它而拋出IndexError。在這種情況下,你將無法捕捉到,但堆棧轉儲將顯示for row in hkx

+0

hkx在這裏定義:'hkx = csv.reader(open(HKXcsv,'rb'))' 您可以從最後一行輸出中看到錯誤。 「行數據」行顯示導致異常的行的內容。 '行數據'應該包含大約8個元素,而不僅僅是'鎮州'。當行[4]中有重複的名字時,它似乎就會發生。 輸出: 8331顧羣 8331 LUI永康愛德華 8331寶摯朝 8099包洪煒 錯誤:列表索引超出範圍 行數據:1「鄭州」] – Nathan

+0

什麼,立刻在csv文件'鄭州'之後?該文件中是否有Ctrl-Z字符? csv模塊會將Ctrl-Z視爲終止文件(即使您以二進制模式打開它)。特別是有沒有非ascii字符可以編碼,以便有一個值爲26的字節? – Duncan

+0

好吧,我通過跳過'csv.open'解決了這個問題,只是從列表中讀取行數據。也更快。 – Nathan