我想从 csv 文件中读取最多 20 行:
rows = [csvreader.next() for i in range(20)]
如果文件有 20 行或更多行,则工作正常,否则会因 StopIteration 异常而失败。
是否有一种优雅的方法来处理可能在列表理解中引发 StopIteration 异常的迭代器,或者我应该使用常规的 for 循环?
我想从 csv 文件中读取最多 20 行:
rows = [csvreader.next() for i in range(20)]
如果文件有 20 行或更多行,则工作正常,否则会因 StopIteration 异常而失败。
是否有一种优雅的方法来处理可能在列表理解中引发 StopIteration 异常的迭代器,或者我应该使用常规的 for 循环?
您可以使用itertools.islice
. 它是列表切片的迭代器版本。如果迭代器的元素少于 20 个,它将返回所有元素。
import itertools
rows = list(itertools.islice(csvreader, 20))
itertools.izip
( 2 ) 提供了一种轻松使列表推导起作用的方法,但islice
在这种情况下看起来是要走的路。
from itertools import izip
[row for (row,i) in izip(csvreader, range(20))]
如果出于某种原因您还需要跟踪行号,我建议您:
rows = zip(xrange(20), csvreader)
如果没有,您可以在之后将其删除,或者...好吧,您最好从一开始就尝试其他更优化的选项:-)