2011-11-28 5 views
15

例外ブロックにcontinueが含まれていても、例外で終了する単純なforループをPythonで使用しています。 IndexErrorに当たってループが終了すると、まだ約10行が読み込まれており、ループはforから出ます。私はここで何が欠けていますか?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の定義方法は、以外ではありません。それが単純なリストではなくジェネレータであれば、それを単純に反復するとIndexErrorがスローされるかもしれません。その場合、スタックダンプにはfor row in hkxの行が表示されます。

+0

hkxはここで定義されています: 'hkx = csv.reader(open(HKXcsv、 'rb'))' 出力の最後の2行からエラーを見ることができます。行「行データ」は、例外の原因となった行の内容を示します。 'Row Data'には、 'Zhenngzhou'だけでなく、約8つの要素が含まれている必要があります。行[4]に重複した名前があったときに起こるようです。 出力: 8331 GU Qun 8331 LUIウィング香港エドワード 8331 BAO志チャオ 8099 BAO香港魏 エラー:範囲外のリストインデックス 行のデータ:1 [ '鄭州'] – Nathan

+0

すぐcsvファイルである何「鄭州」の後に?ファイルにCtrl-Z文字があるのでしょうか? csvモジュールは、(バイナリモードで開いていても)Ctrl-Zをファイルの終了と見なします。特に、値26のバイトがあるようにエンコードされている可能性のある非アスキー文字はありますか? – Duncan

+0

さて、私は 'csv.open'をスキップし、行のデータをリストから読み戻すだけで解決しました。より速く。 – Nathan

関連する問題