2017-08-16 130 views
5

我正在使用csv庫來解析文件。我需要跳過6行,直接到第7行,並解析其餘部分。我能跑reader.next() 6倍,但它看起來很奇怪:在Python中讀取文件時,有沒有辦法跳到特定的行號?

reader = csv.reader(csvfile) 

reader.next() 
reader.next() 
reader.next() 
reader.next() 
reader.next() 
reader.next() 

for row in reader: 
    print row 

所以我想知道如果有一種方法可以跳過6行另一種方式?

+0

爲什麼(6):reader.next()' – varela

+0

也可以這樣做:對於列表中的行(閱讀器)[6:] - 但不是最有效的。 –

回答

10

是的。使用itertools.islice

from itertools import islice 
reader = csv.reader(csvfile) 

for row in islice(reader, 7, None): 
    print row 

islice需要一個迭代,那麼下面的位置參數的工作很像典型的列表切片啓停步:

>>> x = list(range(14)) 
>>> x[7:None] 
[7, 8, 9, 10, 11, 12, 13] 
>>> x[7:] 
[7, 8, 9, 10, 11, 12, 13] 
>>> 
>>> list(islice(x, 7, None)) 
[7, 8, 9, 10, 11, 12, 13] 

但是,沒有負索引不允許的。

>>> list(islice(x, -1, None)) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: Indices for islice() must be None or an integer: 0 <= x <= maxint. 
>>> 

但是,它仍然是非常靈活的,因此,例如,採取一切,其他行從第一個(即偶數行):

for row in islice(reader, None, None, 2): 
    print row 

或者每隔一個行開始在第二行(即奇數行):

for row in islice(reader, 1, None, 2): 
    print row 
0

你可以這樣做:

for i, row in enumerate(reader): 
    if i<7: continue 
    print row 

或者你可以用在發電機:

for row in (e for i, e in enumerate(reader) if i>=7): 
    print row 

如果你想跳過某些特定行:

for i, row in enumerate(reader): 
    if i in (1,13,666): continue # skip unlucky lines... 
    print row 

或者,包裹在一個發電機:

for row in (e for i, e in enumerate(reader) if i not in (1,13,666)): 
    print row 
+0

請問爲什麼要投票? – dawg

相關問題