Python: Стоп-исключение исключений и списки - PullRequest
10 голосов
/ 10 июля 2009

Я хотел бы прочитать не более 20 строк из файла CSV:

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

Работает нормально, если файл содержит 20 или более строк, в противном случае происходит сбой с исключением StopIteration.

Есть ли элегантный способ иметь дело с итератором, который может генерировать исключение StopIteration в понимании списка, или я должен использовать регулярный цикл for?

Ответы [ 3 ]

12 голосов
/ 10 июля 2009

Вы можете использовать itertools.islice. Это итераторная версия нарезки списка. Если итератор содержит менее 20 элементов, он вернет все элементы.

import itertools
rows = list(itertools.islice(csvreader, 20))
0 голосов
/ 08 августа 2009

itertools.izip ( 2 ) обеспечивает простой способ работы со списками, но в этом случае islice выглядит подходящим способом.

from itertools import izip
[row for (row,i) in izip(csvreader, range(20))]
0 голосов
/ 10 июля 2009

Если по какой-либо причине вам также необходимо отслеживать номер строки, я бы порекомендовал вам:

rows = zip(xrange(20), csvreader)

Если нет, вы можете удалить его после или ... ну, лучше попробуйте другой вариант, более оптимальный с самого начала: -)

...