2014-03-27 44 views
1

我需要最琐碎的解决方案转换fasta.txt包含多个核苷酸序列等解析FASTA序列到词典

>seq1 
TAGATTCTGAGTTATCTCTTGCATTAGCAGGTCATCCTGGTCAAACCGCTACTGTTCCGG 
CTTTCTGATAATTGATAGCATACGCTGCGAACCCACGGAAGGGGGTCGAGGACAGTGGTG 
>seq2 
TCCCTCTAGAGGCTCTTTACCGTGATGCTACATCTTACAGGTATTTCTGAGGCTCTTTCA 
AACAGGTGCGCGTGAACAACAACCCACGGCAAACGAGTACAGTGTGTACGCCTGAGAGTA 
>seq3 
GGTTCCGCTCTAAGCCTCTAACTCCCGCACAGGGAAGAGATGTCGATTAACTTGCGCCCA 
TAGAGCTCTGCGCGTGCGTCGAAGGCTCTTTTCGCGATATCTGTGTGGTCTCACTTTGGT 

到词典(名称,值)对象,其中名称将是>头和值将被分配到相应的序列。

下面你可以找到我的失败尝试通过2所列出做

f = open('input2.txt', 'r') 
list={} 
names=[] 
seq=[] 
for line in f: 
if line.startswith('>'): 
    names.append(line[1:-1]) 
elif line.startswith('A') or line.startswith('C') or line.startswith('G') or line.startswith('T'): 
    seq.append(line) 

list = dict(zip(names, seq)) 

,如果你给我提供的如何解决的解决方案,我会感谢(不包含长序列> 1线工作)它和例子如何通过单独的功能来做到这一点。

感谢您的帮助,

格列布

回答

1

一个简单的修正你的代码:

from collections import defaultdict #this will make your life simpler 
f = open('input2.txt','r') 
list=defaultdict(str) 
name = '' 
for line in f: 
    #if your line starts with a > then it is the name of the following sequence 
    if line.startswith('>'): 
     name = line[1:-1] 
     continue #this means skips to the next line 
    #This code is only executed if it is a sequence of bases and not a name. 
    list[name]+=line.strip() 
+0

的建议非常感谢。你也可以向我提供使用defaultdict和列表实例的示例(将名称和序列保存在除字典之外的单独列表中)。 最好的, Gleb – user3470313

1

这是更好地biopython库使用

from Bio import SeqIO 
input_file = open("input.fasta") 
my_dict = SeqIO.to_dict(SeqIO.parse(input_file, "fasta"))