如何使用python将行从某些行删除到另一个特定行



我有一个文件显示如下。我想删除从>rev_开始到下一行的行,而不是删除> >行。我想要一个python代码来实现它。输入文件:

>name1
fgrsagrhshsjtdkj
jfsdljgagdahdrah
gsag
>rev_name1                # delete from here
jfdsfjdlsgrgagrehdsah
fsagasfd                  # until here
>name2
jfosajgreajljioesfg
fjsdsagjljljlj
>rev_name2                # delete from here
jflsajgljkop
ljljasffdsa               # until here
>name3
.......

输出文件:

>name1
fgrsagrhshsjtdkj
jfsdljgagdahdrah
gsag
>name2
jfosajgreajljioesfg
fjsdsagjljljlj
>name3
.......

我的代码如下,但它不能工作。

mark = {}
with open("human.fasta") as inf, open("human_norev.fasta",'w') as outf:
    for line in inf:
        if line[0:5] == '>rev_':
            mark[line] = 1
        elif line[0] == '>':
            mark[line] = 0
    if mark[line] == 0:
        outf.write(line)

我建议至少尝试自己想出一个解决方案,然后再在这里询问我们。问问自己关于我可以以哪些不同的方式解决问题的问题,逐个字符/逐行/正则表达式解析是否足以解决这个问题。

但是在这种情况下,由于确定何时开始和停止删除行始终位于行的开头,因此逐行检查起始的几个字符是有意义的。

i = """>name1
fgrsagrhshsjtdkj
jfsdljgagdahdrah
gsag
>rev_name1                # delete from here
jfdsfjdlsgrgagrehdsah
fsagasfd                  # until here
>name2
jfosajgreajljioesfg
fjsdsagjljljlj
>rev_name2                # delete from here"""
final_string = ""
keep_line = True
for line in i.split('n'):
    if line[0:5] == ">rev_":
        keep_line = False
    elif line[0] == '>':
        keep_line = True
    if keep_line:
        final_string += line + 'n'
print(final_string)

如果您希望这些行直接进入控制台,您可以删除末尾的打印并用print(line)替换final_string += line + 'n'

您的代码不起作用,因为(除其他外(您没有标记既不以>rev开头也不以>开头的行。此外,您需要另一个循环来输出所有已标记为输出的行 - 现在您只输出最后一行。

Alec 的回答很好,但我建议使用正则表达式的不同方法:

import re
regex = re.compile(r">rev_[^>]*")
with open("human.fasta") as inf, open("human_norev.fasta", "w") as outf:
    outf.write(regex.sub("", inf.read()))

在 regex101.com 上实时测试正则表达式。

代码也可以如下所示:

with open("human.fasta") as inf, open("human_norev.fasta",'w') as outf:
    del_start = False
    for line in inf:
        if line.startswith('>rev_'):
            del_start = True
        elif line.startswith('>'):
            del_start = False
        if not del_start:
            outf.write(line)    

最新更新