从文件中读取:读取两行,跳过两行

时间:2013-07-25 09:41:45

标签: python

我想从文件中读取两行,跳过接下来的两行并读取接下来的两行,依此类推

line 1 (read)
line 2 (read)
line 3 (skip)
line 4 (skip)
line 5 (read)
line 6 (read)
...
<eof>

任何想法如何做到这一点?谢谢!

我的解决方案:

            j = 2

            for i, line in enumerate(f.readlines()):
                if i in xrange(j - 2, j):
                    print line
                elif i == j:
                    j += 4

4 个答案:

答案 0 :(得分:3)

您可以使用the itertools consume() recipe推进文件的迭代 - 因为它很快(它使用itertools函数来确保迭代发生在低级代码中,使得消耗值的过程非常快速,并通过存储消耗的值避免使用内存):

from itertools import islice
import collections

def consume(iterator, n):
    "Advance the iterator n-steps ahead. If n is none, consume entirely."
    # Use functions that consume iterators at C speed.
    if n is None:
        # feed the entire iterator into a zero-length deque
        collections.deque(iterator, maxlen=0)
    else:
        # advance to the empty slice starting at position n
        next(islice(iterator, n, n), None)

通过这样做,您可以执行以下操作:

with open("file.txt") as file:
    for i, line in enumerate(file, 1):
        ...
        if not i % 2:
            consume(file, 2)  # Skip 2 lines ahead.

我们使用enumerate()来计算我们的进度,并且每两行跳过一次(请注意enumerate()在跳过值之后添加数字,这意味着它没有t按需要计算跳过的值。

这是一个很好的解决方案,因为它可以避免对跳过的值进行任何Python循环,完全删除它们。

答案 1 :(得分:3)

将它们分组成对,然后跳过所有其他对,例如:

from itertools import izip_longest, islice

with open('somefile') as fin:
    paired = izip_longest(*[iter(fin)] * 2, fillvalue='')
    every_other = islice(paired, None, None, 2)
    for lines in every_other:
        line1, line2 = lines
        print line1, line2

包含第1 - 9行的文件的输出示例:

1 2
5 6
9 

或者将它们作为一个长序列迭代:

from itertools import chain
lines = chain.from_iterable(every_other)
for line in lines:
    # whatever

答案 2 :(得分:0)

那样的东西?

f = open("file", "r")

i = 0
for line in f.readlines():
    if i % 4 or (i+1) % 4:
        print line

即。无论如何,你必须阅读所有的内容,但不要用你不想读的行来做一个动作。

答案 3 :(得分:0)

counter = 0
for line in FILE:
    if counter == 0 or counter == 1:
        print line
    counter += 1

    if counter == 3:
        counter = 0