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)
そうでない場合は、後でそれを取り除くことができます...まあ、最初からより最適な他のオプションを試してみたほうがいいです:-)