在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行另一种方式?
答
是的。使用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
为什么(6):reader.next()' – varela
也可以这样做:对于列表中的行(阅读器)[6:] - 但不是最有效的。 –