Me gustaría leer como máximo 20 líneas de un archivo csv:

rows = [csvreader.next() for i in range(20)]

Funciona bien si el archivo tiene 20 o más filas, de lo contrario falla con una excepción StopIteration.

¿Hay una manera elegante de lidiar con un iterador que podría lanzar una excepción StopIteration en una comprensión de la lista o debería usar un bucle for regular?

10
Parand 10 jul. 2009 a las 03:09

3 respuestas

La mejor respuesta

Puede usar itertools.islice. Es la versión iteradora de la división de listas. Si el iterador tiene menos de 20 elementos, devolverá todos los elementos.

import itertools
rows = list(itertools.islice(csvreader, 20))
13
Ayman Hourieh 9 jul. 2009 a las 23:15

Si por alguna razón necesita también realizar un seguimiento del número de línea, le recomiendo:

rows = zip(xrange(20), csvreader)

Si no, puedes quitarlo después o ... bueno, será mejor que pruebes otra opción más óptima desde el principio :-)

-1
fortran 9 jul. 2009 a las 23:26

itertools.izip (2) proporciona una manera de hacer que las comprensiones de listas funcionen fácilmente, pero islice parece ser la manera de ve en este caso.

from itertools import izip
[row for (row,i) in izip(csvreader, range(20))]
0
outis 8 ago. 2009 a las 01:00