python 中的 FASTA 文件解析序列

Parsing sequences from a FASTA file in python

我有一个文本文件:

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

我想在一个列表中存储 header (name_1, name_2..) 和数据 (data_1, data_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   

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

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

def function (stuff):
    seq = whatever

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

您无法访问 function 之外的 seq。这样做的通常方法是让 function return 一个值,并将它捕获在调用者的一个变量中。

def function (stuff):
    seq = whatever
    return seq

s = function('data')
print s

(我特意在函数内外使用了不同的变量名,在function里面你不能访问s或者data,在外面,你不能访问[=20= ...

除此之外,我们可以尝试编写一个函数,其中 return 是序列列表和它们的描述列表。

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

这不是特别优雅,但应该可以帮助您入门。更好的设计是 return 一个(描述,数据)元组列表,其中描述及其数据紧密耦合在一起。

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

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