我有一个文件显示如下。我想删除从>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)