-3

我有档案

Header 1
line 1
line 2
line 3
line 4
Header 2
line 1
line 2
line 3
line 4

我想阅读标题 1,然后阅读它下面的第 3 行和第 4 行,之后我想阅读标题 2,然后在不同的上下文中阅读它下面的第 3 行和第 4 行。在这两种情况下搜索第 3 行和第 4 行的字符串是相同的,但行并不完全相同。目前我正在使用搜索标题 1

for line in file    
    if "Header 1" in line:

我无法在该文件的 for 循环中使用 readline 来读取 4 行的块。

4

2 回答 2

0

存储所有行,然后分析它们:

data = open("filename.txt").readlines()

这将使根据需要在行之间跳转变得容易,这在直接从文件中读取时是不正确的。

于 2013-02-08T13:16:34.803 回答
0

unwind 的答案适用于小文件。如果您想要一个通用的解决方案,请坚持使用迭代器和生成器。

你可以定义一个生成器函数来生成line_i、line_i+3和line_i+4的元组。

随着进口

from collections import deque
from itertools import islice

我们可以定义一个新的生成器函数:

def reflexive_zip(iterator, offset = 0):
    offset = int(offset)
    if offset == 0:
        for element in iterator:
            yield (element, element)
    else:
        d = deque(islice(iterator,abs(offset)))
        for element in iterator:
            d.append(element)
            if offset < 0:
                yield (element, d.popleft())
            else:
                yield (d.popleft(), element)

它需要 a iterator,使用 a 创建一些缓冲区deque并产生 的元素的元组iterator。偏移量可以通过offset参数控制。

完整的脚本来了。用法示例在主要部分。

if __name__ == "__main__":
    from cStringIO import StringIO

    f = StringIO("""Header 1
line 1
line 2
line 3
line 4
Header 2
line 1
line 2
line 3
line 4""")

    #for line, other_line in reflexive_zip(f, 4):
    #    print "%s -> %s" %(line, other_line)

    for ((line, _ignore),(line3, line4)) in reflexive_zip(reflexive_zip(f,1),3):
        print "%s -> %s    %s" %(line, line3, line4)


from collections import deque
from itertools import islice

def reflexive_zip(iterator, offset = 0):
    offset = int(offset)
    if offset == 0:
        for element in iterator:
            yield (element, element)
    else:
        d = deque(islice(iterator,abs(offset)))
        for element in iterator:
            d.append(element)
            if offset < 0:
                yield (element, d.popleft())
            else:
                yield (d.popleft(), element)

if __name__ == "__main__":
    from cStringIO import StringIO

    f = StringIO("""Header 1
line 1
line 2
line 3
line 4
Header 2
line 1
line 2
line 3
line 4""")

    #for line, other_line in reflexive_zip(f, 4):
    #    print "%s -> %s" %(line, other_line)

    for ((line, _ignore),(line3, line4)) in reflexive_zip(reflexive_zip(f,1),3):
        print "%s -> %s    %s" %(line, line3, line4)

输出:

Header 1
 -> line 3
    line 4

line 1
 -> line 4
    Header 2

line 2
 -> Header 2
    line 1

line 3
 -> line 1
    line 2

line 4
 -> line 2
    line 3

Header 2
 -> line 3
    line 4
于 2013-02-08T14:09:56.313 回答