在Python中,如果满足条件,则跳过文本文件中的行直到下一个块

2024-04-23 16:05:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个巨大的文本文件,由这样的“块”组成:

block
object pen
fruit apple
people mike
block
electronic laptop
city dallas
fruit banana
object stapler
vehicle car
block
people george
fruit orange
vehicle truck
city austin
object hammer

在每一个街区里,在一个随机的线上只有一个水果。每个块有不同的行数。我想在这个文件中迭代,打印包括水果名称在内的所有内容,然后跳过到下一个块。一旦我在一个街区找到水果,检查下一行是不是水果就浪费时间了。我只想跳到下一个街区,但问题是我不知道前面有多少行。因此,输出应如下所示:

^{pr2}$

我可以用两种方法生成这个输出,一种是:

flag = True
with open("sample.txt", "r") as f:
    for line in f.readlines():
        if line.split()[0] == 'fruit':
            print "the fruit is: " + line.split()[1]
            flag = False
        if line.split()[0] == 'block':
            flag = True
        if flag:
            print line

还有两个:

flag = False
with open("sample.txt", "r") as f:
    for line in f.readlines():
        if line.split()[0] == 'fruit':
            print "the fruit is: " + line.split()[1]
            flag = True
        if line.split()[0] == 'block':
            flag = False
        if flag:
            continue
        print line 

但这不是我想要的。我的代码仍然检查每一行是否是水果。我想跳过水果后的线路,一直到街区,然后从那里继续。我怎么跳?在


Tags: falsetruecityifobjectwithlinepeople
3条回答
from itertools import takewhile, dropwhile

def not_block(line): return line != 'block\n'
def not_fruit(line): return not line.startswith('fruit ')

with open("sample.txt", "r") as f:
    while True:
        for line in takewhile(not_fruit, dropwhile(not_block(f)):
            print line.rstrip()
        fruitline = next(f, None)
        if fruitline:
            print "the fruit is: " + fruitline.split()[1]
        else:
            break

说我疯了,但我想用list comprehensionzip()对这个问题进行不同的挖掘:

with open("sample.txt", "r") as file:
    lines = [line.strip('\n') for line in file.readlines()]

blocks = [i for i, j in enumerate(lines) if j == 'block']
fruits = [i for i, j in enumerate(lines) if 'fruit' in j]

for i, j in zip(blocks, fruits):
    print('\n'.join(lines[i:j+1]))

输出:

^{pr2}$

但只有在每个block后面总是在下一个block之前加一个fruit,这才有效。在

看起来很漂亮,好吧。别怀疑我选择的武器。。。在

您可以添加一个在找到block行后触发的内部循环。请注意,这假设您的数据格式良好(即,每个块都有一个结果)。在

with open('data.txt') as f:
    for line in f:
        line = line.strip()
        if line == 'block':
            print(line)
            for line in f:
                line = line.strip()
                if line.startswith('fruit '):
                    print('the fruit is:', line.split(None, 1)[1])
                    break
                else:
                    print(line)

另一个你可以做的事情是更复杂一些,但是如果数据文件真的很大的话,可以更快地使用^{}和{a2}。在

相关问题 更多 >