在起点和终点之间打印线

时间:2015-12-26 16:33:23

标签: python

假设我有一个这种格式的文本文件:

***a
foo bar
lorem ipsum
dolor
---a

我想打印***a---a之间的界限我试图用这个来做:

def printlines():
    pattern = open('text.txt').read().splitlines()
    for line in pattern:
        if line == "***a":
            pass
            while line != "---a":
                print line

        else:
            pass

但它在无限循环中打印***a。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

使用breakcontinue

def printlines():
    pattern = open('text.txt').read().splitlines()
    for line in pattern:
        if line == "***a":
           continue
        if line == "---a":
           break
        print line

<强>额

  

break语句就像在C中一样,突破了最小的封闭   for或while循环。

继续

  

继续声明,也是从C借来的,继续下一个   迭代循环。

答案 1 :(得分:1)

使用状态机。这意味着,一旦您看到开始模式,请设置一个状态,以便您知道以下行现在与您相关。然后继续寻找结束模式将其关闭:

def printlines():
    # this is our state
    isWithin = False

    with open('text.txt') as f:
        for line in f:
            # Since the line contains the line breaking character,
            # we have to remove that first
            line = line.rstrip()

            # check for the patterns to change the state
            if line == "***a":
                isWithin = True
            elif line == "---a":
                isWithin = False

            # check whether we’re within our state
            elif isWithin:
                print line

由于我们仅在isWithin状态下打印,因此我们可以轻松跳过***a / ---a模式的任何部分。因此,处理以下文件将正确地打印出HelloWorld,而不是其他内容:

Foo
***a
Hello
---a
Bar
***a
World
---a
Baz

此外,您应该使用with语句打开文件,并直接迭代文件对象,而不是阅读它并调用splitlines()。这样你就可以确保文件正确关闭,并且你只能读取一行接一行,从而提高内存效率。

答案 2 :(得分:1)

如果你有多次出现,你可以在点击起始线时开始内循环,这相当于你想要做的事情:

with open("test.txt") as f:
    for line in f:
        if line.rstrip() == "***a":
            print("")
            for line in f:
                if line.rstrip() == "---a":
                    break
                print(line.rstrip())

适用于:

***a
foo bar
lorem ipsum
dolor
---a
***a
bar bar
foobar
foob
---a

输出:

foo bar
lorem ipsum
dolor

bar bar
foobar
foob

如果你想拥有没有换行符的行,我们可以map关闭它们并且仍然逐行迭代:

with open("test.txt") as f:
    # itertools.imap python2
    f = map(str.rstrip, f)
    for line in f:
        if line == "***a":
            print("")
            for line in f:
                if line == "---a":
                    break
                print(line)