11

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

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

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

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

4

3 回答 3

15

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

import itertools
rows = list(itertools.islice(csvreader, 20))
于 2009-07-09T23:15:50.297 回答
0

itertools.izip( 2 ) 提供了一种轻松使列表推导起作用的方法,但islice在这种情况下看起来是要走的路。

from itertools import izip
[row for (row,i) in izip(csvreader, range(20))]
于 2009-08-08T01:00:55.693 回答
-1

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

rows = zip(xrange(20), csvreader)

如果没有,您可以在之后将其删除,或者...好吧,您最好从一开始就尝试其他更优化的选项:-)

于 2009-07-09T23:26:24.177 回答