2013-09-26 98 views
6

如何使用Python csv阅读器遍历特定范围的行?如何使用Python csv阅读器遍历特定范围的行?

下面的代码遍历所有行:

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接受一个可迭代):

注意 :只适用于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