2013-09-26 21 views
6

Python csv readerで特定の範囲の行をループする方法は?Python csv readerで特定の範囲の行をループする方法は?

次のコードは、すべての行をループ:

with open(trainFile, 'rt') as csvfile: 
    spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|') 
    for row in spamreader: 
     print (', '.join(row)) 

は私だけ与えられたからループしたい(I jまで)。

答えて

7

あなたはitertools.isliceを使用することができます。

import itertools 

i, j = 10, 20 
with open(trainFile, 'rt') as csvfile: 
    spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|') 
    for row in itertools.islice(spamreader, i, j+1): 
     print (', '.join(row)) 

オルタナティブ(csv.readerが反復可能に受け入れるためのコードを、以下のことが可能です):

NOTE :CSV行に改行が含まれていない場合にのみ機能します。

import itertools 

i, j = 10, 20 
with open(trainFile, 'rt') as csvfile: 
    spamreader = csv.reader(itertools.islice(csvfile, i, j+1), 
          delimiter=' ', quotechar='|') 
    for row in spamreader: 
     print (', '.join(row)) 
+0

@kworrを使用して別のitertoolsの実装では、コメントありがとうございました。私はそれに言及する。 – falsetru

+1

あなたの代わりに、 'i'と' j'の値は参照されていません...私はそれが示されているように動作するのではないかと疑います。 – martineau

+0

@martineau、ありがとうございます。それに応じて代替案を更新しました。 – falsetru

1

使用islice、例えば:

rows_1_to_50 = itertools.islice(spamreader, 0, 50) 
for row in rows_1_to_50: 
    pass 
1

dropwhiletakewhile

from itertools import takewhile, dropwhile 
trainFile = 'x.1' 
low_lim = 3 
high_lim = 6 
with open(trainFile, 'rt') as csvfile: 
    spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|') 
    g = (x for x in enumerate(spamreader, 1)) 
    g = dropwhile(lambda x: x[0] < low_lim, g) 
    g = takewhile(lambda x: x[0] <= high_lim, g) 
    for row in g: 
     print (', '.join(row[1])) 
+0

完全なパスを指す 'trainFile = 'x.1''と言うとき、正しいですか? –

+0

@ MattO'Brien、それは正しい。完全であっても相対的であってもよい – iruvar

関連する問題