我有一个带有消息的文本文件,该文件以“ 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”行之外的两个单词之间读取
答案 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)