在Python中如何删除带有特定关键字的行之后的后续行

在Python中如何删除带有特定关键字的行之后的后续行,python,text,file-io,Python,Text,File Io,在找到带有关键字“banana”的特定行之后,我想删除后续行,在本例中为“berry” Sample.txt orange apple banana berry melon 然而,我的脚本删除的是“香蕉”而不是“浆果”…为什么 大概是这样的: flag = False with open("C:\sample.txt") as in_f: for line in in_f: if flag: # previous line have "banana", so skip

在找到带有关键字“banana”的特定行之后,我想删除后续行,在本例中为“berry”

Sample.txt

orange
apple
banana
berry
melon
然而,我的脚本删除的是“香蕉”而不是“浆果”…为什么

大概是这样的:

flag = False
with open("C:\sample.txt") as in_f:
    for line in in_f:
        if flag: # previous line have "banana", so skip this line
            flag = False
            continue
        if "banana" in line: # set flag to skip line
            flag = True
        print line
import fileinput

fin = fileinput.input('/home/jon/text.txt', inplace=1)
for line in fin:
    print line,
    if line.strip() == 'banana':
        next(fin, None) # as suggested by @thg435 doesn't hurt to use default to avoid StopIteration (as next iteration will just be a no-op anyway)
大概是这样的:

flag = False
with open("C:\sample.txt") as in_f:
    for line in in_f:
        if flag: # previous line have "banana", so skip this line
            flag = False
            continue
        if "banana" in line: # set flag to skip line
            flag = True
        print line
import fileinput

fin = fileinput.input('/home/jon/text.txt', inplace=1)
for line in fin:
    print line,
    if line.strip() == 'banana':
        next(fin, None) # as suggested by @thg435 doesn't hurt to use default to avoid StopIteration (as next iteration will just be a no-op anyway)
这样做:

flag = False
with open("C:\sample.txt") as in_f:
    for line in in_f:
        if flag: # previous line have "banana", so skip this line
            flag = False
            continue
        if "banana" in line: # set flag to skip line
            flag = True
        print line
import fileinput

fin = fileinput.input('/home/jon/text.txt', inplace=1)
for line in fin:
    print line,
    if line.strip() == 'banana':
        next(fin, None) # as suggested by @thg435 doesn't hurt to use default to avoid StopIteration (as next iteration will just be a no-op anyway)
这利用了迭代
fin
对象的优势,因此它不会看到下一行-这意味着您不必担心设置/取消设置标志。。。(这可能会导致错误)

这样做:

flag = False
with open("C:\sample.txt") as in_f:
    for line in in_f:
        if flag: # previous line have "banana", so skip this line
            flag = False
            continue
        if "banana" in line: # set flag to skip line
            flag = True
        print line
import fileinput

fin = fileinput.input('/home/jon/text.txt', inplace=1)
for line in fin:
    print line,
    if line.strip() == 'banana':
        next(fin, None) # as suggested by @thg435 doesn't hurt to use default to avoid StopIteration (as next iteration will just be a no-op anyway)
这利用了迭代
fin
对象的优势,因此它不会看到下一行-这意味着您不必担心设置/取消设置标志。。。(可能导致错误)

请尝试此选项

filename = r"sample.txt"
counter = -1
for linenum,line in enumerate(fileinput.FileInput(filename, inplace=1)):
    if "banana" in line:
        counter = linenum + 1
    if linenum == counter:
        line.strip()
    else:
        print line,
请试试这个

filename = r"sample.txt"
counter = -1
for linenum,line in enumerate(fileinput.FileInput(filename, inplace=1)):
    if "banana" in line:
        counter = linenum + 1
    if linenum == counter:
        line.strip()
    else:
        print line,


首先,这个脚本从不删除任何内容,事实上,我能看到的是,它打印文件中的任何一行,除非行中有“banana”,在这种情况下,它会增加一个计数器,然后从当前行的末尾去掉空白。。。。我建议你仔细阅读你的python技能,因为这没有任何作用。@inbar:它确实会删除带有关键字的行。你说的
delete
是指
filter
吗?@inbar Rose的评论是有效的。代码中的缺陷是没有删除任何内容。实际上你正在重写整个文件。您正在打印所有行,但其中有“香蕉”的行除外。inplace=1允许您这样做。@在本例中,您应该阅读python技能。首先,这个脚本从不删除任何内容,事实上,我能看到的是,它打印文件中的任何一行,除非行中有“banana”,在这种情况下,它会增加一个计数器,然后从当前行的末尾去掉空白。。。。我建议你仔细阅读你的python技能,因为这没有任何作用。@inbar:它确实会删除带有关键字的行。你说的
delete
是指
filter
吗?@inbar Rose的评论是有效的。代码中的缺陷是没有删除任何内容。实际上你正在重写整个文件。您正在打印所有行,但其中有“香蕉”的行除外。inplace=1允许您这样做。@在本例中,您应该阅读python技能。例如,尝试回答(和评论)。将弹簧改为
print
@cleg:谢谢你的建议。我从来都不知道你会那样用“国旗”。良好的学习经验。再次感谢。@Inbar:我明白了。很好的观察。尽管如此,只要我能打印出除要删除的行之外的所有行,那么它就可以帮助我重写除要删除的行之外的文件。谢谢。@user1027101不客气。实际上这是惯例。顺便说一句,这是一个非常简单的有限状态机的例子——用于解析器和编译器的机制:)@user1027101也经常使用“跳过”而不是“删除”——这也是一个解决方案将弹簧改为
打印
@cleg:谢谢你的建议。我从来都不知道你会那样用“国旗”。良好的学习经验。再次感谢。@Inbar:我明白了。很好的观察。尽管如此,只要我能打印出除要删除的行之外的所有行,那么它就可以帮助我重写除要删除的行之外的文件。谢谢。@user1027101不客气。实际上这是惯例。顺便说一句,这是一个非常简单的有限状态机-机制的例子,用于解析器和编译器:)@user1027101也经常使用“跳过”而不是“删除”-也是一个解决方案,我会使用
next(fin,None)
,以防万一。@Jon:Wow。酷。非常感谢。我会使用
下一个(fin,None)
,以防万一。@Jon:Wow。酷。非常感谢。它很有效!!我想知道你为什么要写“counter=-1”这样的字?它很有效!!我想知道你为什么要写“counter=-1”?