11
votes

Python: Exception d'étoiles et compréhensions de la liste

J'aimerais lire au plus 20 lignes à partir d'un fichier CSV: xxx

fonctionne bien si le fichier a 20 lignes ou plus, échoue avec une exception d'arrêt sinon.

Y a-t-il un moyen élégant de faire face à un itérateur qui pourrait lancer une exception d'arrêt dans une compréhension de la liste ou devrais-je utiliser une boucle régulière?


0 commentaires

3 Réponses :


15
votes

5 commentaires

Merci Ayman. Il semble que la liste des compréhensions de liste doit être mise à jour pour faire face à l'arrêt, non? Il semble que "car" a déjà été mis à jour pour y faire face (il cesse d'itération lorsqu'il rencontre l'exception, l'attrape implicitement) et je ne vois pas une raison évidente de la liste des compréhensions de la liste de ne pas faire de même.


Pour attraper la stariterration par rapport à son ierable, pas à d'autres objets de ce type dans sa suite. Par exemple C = ITER (plage (5)) pour i in gamme (10): Impression I, C.Next () augmentera l'exception de l'arrêt par rapport à c.


A pour la boucle n'atteignit pas implicitement l'arrêt. Il ne l'attrape que s'il est lancé par la méthode suivante de l'itérateur, non si elle est jetée dans le corps de la boucle. Dans votre question, csvreader.next () est analogue à l'organisme de boucle.


<1 seconde en retard! Shakes Fist ;)


C'est juste, vous avez raison. Je suppose que ma construction est un peu funky, itérant au-dessus du compteur au lieu de la CSV iTérable, de sorte que l'exception devrait donc provoquer un arrêt.



-1
votes

Si pour une raison quelconque, vous devez également garder une trace du numéro de ligne, je vous recommanderais:

rows = zip(xrange(20), csvreader)


0 commentaires

0
votes

ITERTOOLS.IFIP CODE> ( 2 ) fournit un moyen de faire facilement des compréhensions de liste, mais islice code> semble être le moyen d'aller dans ce cas.

from itertools import izip
[row for (row,i) in izip(csvreader, range(20))]


2 commentaires

Cela a l'avantage de ne pas compter sur Len () (par exemple pour APSW.Cursor)


énumérable est la bonne façon de le faire, pas de zipper une plage.