Python:StopIteration异常和列表推导

Par*_*and 10 python iterator list-comprehension stopiteration

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

rows = [csvreader.next() for i in range(20)]
Run Code Online (Sandbox Code Playgroud)

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

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

Aym*_*ieh 13

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

import itertools
rows = list(itertools.islice(csvreader, 20))
Run Code Online (Sandbox Code Playgroud)

  • for循环不会隐式捕获StopIteration.如果迭代器的下一个方法抛出它,它只捕获它,而不是它被抛入循环体中.在您的问题中,csvreader.next()类似于循环体. (3认同)
  • 用于捕获相对于其iterable的StopIteration,而不是其套件中的其他此类对象.例如,对于范围(10)中的i,c = iter(range(5)):print i,c.next()将相对于c引发StopIteration异常. (2认同)