2011-11-28 2 views
15

예외 블록에 continue이 포함되어 있어도 예외적으로 종료되는 Python에서 간단한 for 루프가 있습니다. 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' 

(죄송합니다, 여기에 총 파이썬 초보자 ...) 미리 감사합니다!

+11

작동해야합니다. IndexError뿐만 아니라 다른 예외가 발생하지 않았습니까? –

+1

@Nathan : 최소한의 예를 게시 할 수 있습니까? –

+1

@ CédricJulien과 동의 - 출력을 게시 할 수 있습니까? – Marcin

답변

8

다음과 같이 정확히 수행합니다. 예외가 귀하의 코드를 일찍 종료하는 경우 IndexError가 아니거나 블록 try: 블록 외부에서 던져 져야합니다. 행이 적어도 3 항목이 포함 된 경우 당신은 당신이 그것을 피할 수있는 형식 문자열을 사용하는 경우, 출력물의 절반을 얻을거야

>>> 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 
>>> 

참고. (예 : print "{} {}".format(row[2],row[4]))

csv.open에서 오는 것을 제외하고는 hkx가 정의 된 방법에 대해 언급하지 않았습니다. 단순한 목록이 아니라 생성기 인 경우 간단히 iterating하여 IndexError를 throw하는 것일 수 있습니다. 이 경우에 잡을 수는 없지만 스택 덤프는 for row in hkx 행을 표시합니다.

+0

hkx는 여기에 정의되어 있습니다 :'hkx = csv.reader (open (HKXcsv, 'rb'))' 출력의 마지막 몇 줄에서 오류를 볼 수 있습니다. '행 데이터'행은 예외를 발생시키는 행의 내용을 표시합니다. '행 데이터'에는 'Zhenngzhou'가 아니라 약 8 개의 요소가 포함되어야합니다. 행 4에 중복 된 이름이 생길 때 일어나는 것처럼 보입니다. 출력 : 8331 GU 쿤 8331 LUI 윙 홍콩 에드워드 8331 BAO 다우 차오 8099 BAO 홍 웨이 오류 : 즉시 csv 파일에 어떤 일 [ '정주'] – Nathan

+0

: 행 데이터 범위를 벗어난리스트 인덱스 '정저우 '이후? 파일에 Ctrl-Z 문자가있을 수 있습니까? csv 모듈은 Ctrl-Z를 파일 종료로 간주합니다 (바이너리 모드로 열었지만). 특히 값이 26 인 바이트가 있다고 인코딩 된 비 ASCII 문자가 있습니까? – Duncan

+0

글쎄, 나는'csv.open'을 생략하고 목록에서 행 데이터를 다시 읽음으로써이를 해결했다. 더 빨리. – Nathan