使用python读取文本文件中两个字符串之间的行

时间:2019-04-23 15:00:12

标签: python text-files

我有一个带有消息的文本文件,该文件以“ START”行开头,以“ END”行结尾。我希望python代码读取这两个单词之间的行。我有一个代码正在读取这两个单词之间的线。但它也在读取“ START”和“ End”行。我只希望这两个词之间有一行。

我尝试过这段代码,该代码也读取“ START”和“ END”字样。

data=[]
flag=False
with open('/tmp/test.txt','r') as f:
    for line in f:
        if line.startswith('START'):
            flag=True
        if flag:
            data.append(line)
        if line.strip().endswith('END'):
            flag=False

print ''.join(data)  

请建议代码,该代码将在除“ START”和“ END”行之外的两个单词之间读取

2 个答案:

答案 0 :(得分:1)

只需重新排列您的if语句。考虑一下它们流动的顺序以及何时评估if flag。另外,您可以使用elif,以便仅执行三个条件之一,但请确保elif flag行是最后一个条件。

使用示例设置的方式,它将检查行是否以START开头,然后设置标志。发生这种情况后,您将立即检查该标志是否已设置,因此它将打印出START。此外,它将打印每一行,然后在打印完该行后检查 ,以查看它是否应该打印END

通过重新排列顺序,您将看到,如果该行以START开头,则下面没有命令可以打印该行。同样,它会在打印END行之前检查是否应该停止。

with open('/tmp/test.txt','r') as f:
    for line in f:
        if line.strip().endswith('END'):
            flag=False
        if flag:
            data.append(line)
        if line.startswith('START'):
            flag=True

elif版本可能是更好的方法,因为它可以节省一些if语句的检查,但是每次迭代只能执行一个结果。因此,如果更改了标志,则将永远不会打印出该行。

with open('/tmp/test.txt','r') as f:
    for line in f:
        if line.startswith('START'):
            flag=True
        elif line.strip().endswith('END'):
            flag=False
        elif flag:
            data.append(line)

答案 1 :(得分:1)

使用elif而不是多个if来确保仅执行一个分支。

data=[]
flag=False
with open('/tmp/test.txt','r') as f:
    for line in f:
        if line.startswith('START'):
            flag=True
        elif line.strip().endswith('END'):
            flag=False
        elif flag:
            data.append(line)

print '\n'.join(data)