在Python中如何删除带有特定关键字的行之后的后续行
在找到带有关键字“banana”的特定行之后,我想删除后续行,在本例中为“berry” Sample.txt在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
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”?