Python: StopIteration异常与列表推导式

12 投票
3 回答
6125 浏览
提问于 2025-04-15 12:48

我想从一个csv文件中最多读取20行:

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

如果文件有20行或更多,这样做没问题;但如果少于20行,就会出现一个叫做StopIteration的错误。

有没有什么好的方法可以在列表推导式中处理可能会抛出StopIteration错误的迭代器?还是说我应该用普通的for循环呢?

3 个回答

-1

如果出于某种原因你需要记录行号,我建议你这样做:

rows = zip(xrange(20), csvreader)

如果不需要的话,你可以在之后把它去掉,或者……其实你最好从一开始就尝试其他更优的选择 :-)

0

itertools.izip (2) 提供了一种简单的方法来让列表推导式工作,但在这种情况下,islice 似乎是更好的选择。

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

你可以使用 itertools.islice。这个东西是用来处理迭代器的,类似于我们平时用的列表切片。如果这个迭代器里的元素少于20个,它会把所有的元素都返回给你。

import itertools
rows = list(itertools.islice(csvreader, 20))

撰写回答