从python中的FASTA文件解析序列

时间:2015-02-18 06:12:43

标签: python fasta

我有一个文本文件:

>name_1  
data_1  
>name_2  
data_2  
>name_3  
data_3  
>name_4    
data_4  
>name_5  
data_5  

我想将标题(name_1name_2 ....)存储在一个列表中,并将数据(data_1data_2 ....)存储在另一个列表中在Python程序中。

def parse_fasta_file(fasta):
    desc=[]    
    seq=[]    
    seq_strings = fasta.strip().split('>')  
    for s in seq_strings:  
        if len(s):  
            sects = s.split()  
            k = sects[0]  
            v = ''.join(sects[1:])  
    desc.append(k)  
    seq.append(v)    

  for l in sys.stdin:  
  data = open('D:\python\input.txt').read().strip()  
  parse_fasta_file(data)
  print seq   

这是我试过的代码,但我无法得到答案。

1 个答案:

答案 0 :(得分:0)

最根本的错误是尝试访问其范围之外的变量。

def function (stuff):
    seq = whatever

function('data')
print seq   ############ error

您无法在seq之外访问function。通常的方法是让function返回一个值,并将其捕获到调用者中的变量中。

def function (stuff):
    seq = whatever
    return seq

s = function('data')
print s

(我故意在函数内外使用不同的变量名。在function内,您无法访问sdata,而在外部,您无法访问stuffseq。顺便说一句,对于初学者来说,在主线代码中使用同名seq的其他变量会很麻烦,但这会让人感到困惑。)

有了这个,我们可以尝试编写一个函数,它返回一个序列列表和一个描述列表。

def parse_fasta (lines):
    descs = []
    seqs = []
    data = ''
    for line in lines:
        if line.startswith('>'):
            if data:   # have collected a sequence, push to seqs
                seqs.append(data)
                data = ''
            descs.append(line[1:])  # Trim '>' from beginning
        else:
            data += line.rstrip('\r\n')
    # there will be yet one more to push when we run out
    seqs.append(data)
    return descs, seqs

这不是特别优雅,但应该让你开始。更好的设计是返回一个(描述,数据)元组列表,其中描述及其数据紧密耦合在一起。

descriptions, sequences = parse_fasta(open('file', 'r').read().split('\n'))

代码中的sys.stdin循环似乎没有做任何有用的事情。