2017-03-23 102 views
0

我有一个文件显示如下。我想删除从>rev_开始的行,直到>的下一行,而不是删除>行。我想要一个Python代码来实现它。 输入文件:如何从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) 
+0

什么是你的问题? –

+0

如果你想要一个程序,写一个。如果你不能,学习如何编程或聘用程序员。我们不是你的走狗。我希望世界和平,但只是想要它似乎并没有完成。 –

+0

是的,我认为你“想要一个代码”,但你的问题是什么?解决方案的哪一部分有问题?请显示你迄今为止所写的内容。 –

回答

1

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

亚历克的回答是不错的,但我会使用正则表达式提出了不同的方法:

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())) 

测试正则表达式live on regex101.com

3

我建议至少试着想出一个解决方案之前,在这里问我们之前。问你自己有关我可以通过什么不同方式解决问题的问题,将逐字符/逐行/正则表达式解析字符就足以解决这个问题。

但是在这种情况下,由于确定何时开始和停止移除行总是在行的开始处,因此只需逐行并检查开始的几个字符即可。

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'

+0

看看我的代表,但很好。 –

+1

照顾你的代表现在:) –

+1

谢谢,认为它可能会更好地发布一个答案只是建议他们自己尝试,而不是一无所有。所以我增加了一个解决方案,不要被拒绝投票。 –

1

代码还可以如下:

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)  
+0

你的'elif'的'和del_start'部分并不是必须的。此外,代码片段功能仅适用于JavaScript - 其他代码只需要缩进四个空格(select,按Ctrl-K)即可。您可以通过点击每个答案旁边的投票计数器上方向上的三角形来获得有用答案,并且可以通过单击旁边的复选标记来接受最能帮助您的答案。这是在StackOverflow上表示谢意的适当方式。当然,如果它是你最喜欢的那个,你可以接受你自己的答案。玩的开心! –