Python:StopIteration异常和列表推导

时间:2009-07-09 23:09:56

标签: python iterator list-comprehension stopiteration

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

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

如果文件有20行或更多行,则工作正常,否则会失败并出现StopIteration异常。

是否有一种优雅的方法来处理可能在列表解析中抛出StopIteration异常的迭代器,还是应该使用常规for循环?

3 个答案:

答案 0 :(得分:12)

您可以使用itertools.islice。它是列表切片的迭代器版本。如果迭代器的元素少于20个,它将返回所有元素。

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

答案 1 :(得分:0)

itertools.izip2)提供了一种轻松使列表推导工作的方法,但islice看起来是这种情况的方法。

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

答案 2 :(得分:-1)

如果出于某种原因你还需要跟踪行号,我建议你:

rows = zip(xrange(20), csvreader)

如果没有,你可以在之后将它剥离出来......或者,你最好从一开始就尝试其他选择: - )