2015-04-05 66 views
1

我知道这个问题之前已经被问过了,但我从中得到了一些非常奇怪的输出。基本上,我试图将.fasta格式的DNA序列(即以“>”开头的标识符,然后是下一行的序列)转换成相同格式的氨基酸字母。我的代码:将DNA翻译成蛋白质时输出格式不正确

#!/usr/bin/python 

import sys 

filename = sys.argv[1] 

def translate_dna(sequence): 

    codontable = { 
    'ACC':'T', 'ACG':'T', 'ACT':'T', 
    'AAC':'N', 'AAT':'N', 'AAA':'K', 'AAG':'K', 
    'AGC':'S', 'AGT':'S', 'AGA':'R', 'AGG':'R', 
    'CTA':'L', 'CTC':'L', 'CTG':'L', 'CTT':'L', 
    'CCA':'P', 'CCC':'P', 'CCG':'P', 'CCT':'P', 
    'CAC':'H', 'CAT':'H', 'CAA':'Q', 'CAG':'Q', 
    'CGA':'R', 'CGC':'R', 'CGG':'R', 'CGT':'R', 
    'GTA':'V', 'GTC':'V', 'GTG':'V', 'GTT':'V', 
    'GCA':'A', 'GCC':'A', 'GCG':'A', 'GCT':'A', 
    'GAC':'D', 'GAT':'D', 'GAA':'E', 'GAG':'E', 
    'GGA':'G', 'GGC':'G', 'GGG':'G', 'GGT':'G', 
    'TCA':'S', 'TCC':'S', 'TCG':'S', 'TCT':'S', 
    'TTC':'F', 'TTT':'F', 'TTA':'L', 'TTG':'L', 
    'TAC':'Y', 'TAT':'Y', 'TAA':'*', 'TAG':'*', 
    'TGC':'C', 'TGT':'C', 'TGA':'*', 'TGG':'W', 
    'ATG':'M' 
    } 
    proteinsequence = '' 
    start = sequence.find('ATG') 
    sequencestart = sequence[int(start):] 
    stop = sequencestart.find('TAA') 
    cds = str(sequencestart[:int(stop)+3]) 

    for n in range (0,len(cds),3): 
      if cds[n:n+3] in codontable: 
        proteinsequence += codontable[cds[n:n+3]] 
        print proteinsequence 
      sequence = '' 

header = '' 
sequence = '' 
for line in open(filename): 
    if line[0] == ">": 
      if header != '': 
        print header 
        translate_dna(sequence) 

      header = line.strip() 
      sequence = '' 
    else: 
      sequence += line.strip() 

print header 
translate_dna(sequence) 

我的产值有望走出这样的: mouse_IPS1_cds MFAEDKTY(等等等等)

但实际上我得到这个地方打印每一个新的字母线和不完整的序列的结尾: mouse_IPS1_cds 中号 MF MFA MFAE MFAED MFAEDK MFAEDKT MFAEDKTY(它在这里停止时,它应该是长期的呃)

输出因此使这种半角三角形不完整的字母列表,每增加一行。

请问,有没有什么方法可以指出是什么让这种情况发生?为什么它会在每行打印一个新的字母,然后甚至没有完成序列?

任何帮助,非常感谢。

回答

1

您正在打印proteinsequence通过您正在其中构建的循环的每次迭代。因此,你会得到每个中间版本。将打印语句移至循环结尾,就像这样,您只会打印出最终产品:

for n in range (0,len(cds),3): 
     if cds[n:n+3] in codontable: 
       proteinsequence += codontable[cds[n:n+3]] 
     sequence = '' 
print proteinsequence 
+0

哦,当然了!很简单,我不能相信我错过了,谢谢!由于某种原因,它停止了在序列中间的翻译,尽管......不知道为什么。我试图在代码中看到阻止它在顺序中继续前进的内容。我不明白它是如何翻译一些,但不是全部。 – Russ 2015-04-05 01:48:07

+0

嗯,这听起来很奇怪。很难说没有看到FASTA文件的例子,为什么会出现这种情况,但是在你的代码中有两件看起来很奇怪的事情是:1)你检查密码子是否在密码子表中 - 有一个合适的氨基酸可以结合以及三个碱基的序列,所以不应该有一个不在表中的密码子。 2)是否有你在for循环中设置sequence =''的原因?我认为这是无害的,但似乎没有必要。我怀疑那些会导致中途停止,但他们可能是很好的起点? – seaotternerd 2015-04-05 02:10:34

+0

(我假设你已经在中间某个地方检查了一个意想不到的终止密码子,而且我还假设你只是停在三个终止密码子之一的原因) – seaotternerd 2015-04-05 02:11:38