2011-11-28 25 views
15

Tengo un simple for loop en Python que está saliendo en excepciones aunque el bloque de excepción contiene un continue. Todavía quedan 10 líneas para leer cuando llega a IndexError y sale del circuito for. ¿Que me estoy perdiendo aqui?Python: continuar la iteración de for loop en la excepción

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' 

(lo siento, novato total Python aquí ...) Gracias de antemano!

+11

Debería funcionar, ¿está seguro de que no hay otra excepción (no solo IndexError)? –

+1

@ Nathan: ¿Pueden publicar un ejemplo completo y mínimo? –

+1

De acuerdo con @ CédricJulien - ¿podría publicar la salida? – Marcin

Respuesta

8

Hace exactamente lo que debería y continúa con la siguiente línea. Si una excepción termina su código anticipadamente, entonces no debe ser IndexError, o debe estar siendo lanzado desde algún código fuera del bloque 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 
>>> 

Tenga en cuenta que si la fila contiene al menos 3 elementos que obtendrá la mitad de la impresión, si se utiliza una cadena de formato se puede evitar eso. (por ejemplo, print "{} {}".format(row[2],row[4]))

No ha dicho cómo se define hkx, excepto que proviene de csv.open. Si se trata de un generador en lugar de una simple lista, es posible que simplemente al iterar arroje IndexError. En ese caso, no captaría eso, pero el volcado de pila mostraría la línea con el for row in hkx.

+0

hkx se define aquí: 'hkx = csv.reader (abierto (HKXcsv, 'rb'))' Puede ver en la última línea de salida el error. La línea 'Datos de fila' muestra el contenido de la línea que causa la excepción. 'Row Data' debe contener alrededor de 8 elementos, no solo 'Zhenngzhou'. parece suceder cuando haya un nombre duplicado en la fila [4]. Salida: 8331 GU Qun 8331 LUI Ala Hong Edward 8331 BAO Zhi Chao 8099 BAO Hong Wei error: índice de la lista fuera de rango datos de fila: 1 [ 'Zhengzhou'] – Nathan

+0

Lo que está en el archivo CSV de inmediato después del 'Zhengzhou'? ¿Podría haber un carácter Ctrl-Z en el archivo? El módulo csv considerará que Ctrl-Z termina el archivo (aunque lo haya abierto en modo binario). En particular, ¿hay caracteres no ascii que podrían haberse codificado de forma tal que haya un byte con el valor 26? – Duncan

+0

Bueno, resolví esto omitiendo 'csv.open' por completo y solo leyendo los datos de la fila de una lista. Más rápido también – Nathan