2013-09-26 21 views

cevap

7

Sen itertools.islice kullanabilirsiniz:

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)) 

Alternatif (csv.reader bir iterable kabul çünkü kod aşağıdaki mümkündür):

NOT : Yalnızca CSV satırları yeni satır içermediğinde çalışır.

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 kullanarak başka itertools uygulanması, yorum için teşekkür ederiz. Bundan bahsetmiştim. – falsetru

+1

Senin alternatifi içinde 'i' ve 'j' değerleri referans olarak gösterilmiyor ... bu yüzden şüphe duyduğumdan eminim. – martineau

+0

@martineau, İşaret ettiğin için teşekkürler. Alternatifini buna göre güncelledim. – falsetru

1

Kullanım islice, örneğin:

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

dropwhile ve takewhile

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 'dediğinizde, tam yola başvurulur, doğru mu? –

+0

@ MattO'Brien, bu doğru. Tam veya göreli olabilir – iruvar