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

时间:2017-08-16 18:52:30

标签: python csv

我使用csv库来解析文件。我需要跳过6行并直接进入第7行并解析其余部分。我能够运行reader.next() 6次,但看起来很奇怪:

reader = csv.reader(csvfile)

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

for row in reader:
    print row

所以我想知道是否有办法以另一种方式跳过6行?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

你可以这样做:

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