假设我有一个这种格式的文本文件:
***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
。我该如何解决这个问题?
答案 0 :(得分:2)
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
模式的任何部分。因此,处理以下文件将正确地打印出Hello
和World
,而不是其他内容:
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)