在Python中读取文件时,有没有办法跳到特定的行号?

问题描述:

我正在使用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:] - 但不是最有效的。 –

是的。使用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 

你可以这样做:

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