我对Biopython(和一般的编码)还不熟悉,我正试图在一个单独的FASTA文件中编写一种将一系列DNA序列(超过80个)翻译成蛋白质序列的方法。我还想在正确的阅读框中找到顺序。在
以下是我目前所掌握的情况:
from Bio import SeqIO
from Bio.SeqRecord import SeqRecord
for record in SeqIO.parse("dnaseq.fasta", "fasta"):
protein_id = record.id
protein1 = record.seq.translate(to_stop=True)
protein2 = record.seq[1:].translate(to_stop=True)
protein3 = record.seq[2:].translate(to_stop=True)
if len(protein1) > len(protein2) and len(protein1) > len(protein3):
protein = protein1
elif len(protein2) > len(protein1) and len(protein2) > len(protein3):
protein = protein2
else:
protein = protein3
def prot_record(record):
return SeqRecord(seq = protein, \
id = ">" + protein_id, \
description = "translated sequence")
records = map(prot_record, SeqIO.parse("dnaseq.fasta", "fasta"))
SeqIO.write(records, "AAseq.fasta", "fasta")
我当前代码的问题是,虽然它似乎可以工作,但它只给出输入文件的最后一个序列。有谁能帮我弄清楚怎么写所有的序列吗?在
谢谢你!在
正如其他人所提到的,您的代码在尝试编写结果之前会遍历整个输入。我想建议如何使用流媒体方法来实现这一点:
这里的主要改进是:
max
来避免if...elif...else
结构。在您的
if
在for
循环之外,因此它只应用一次,使用变量及其在循环的最后一次迭代结束时的值。如果您希望if
在每次迭代中都发生,则需要在与之前的代码相同的级别缩进:您的函数},这也是
prot_record
使用当前值protein
和{for
循环最后一次迭代结束时的值。在如果我猜对了您想要什么,一种可能是将这个函数声明也放在循环中,以便函数具有一个特定的行为,这取决于循环的当前迭代,并将函数保存在一个列表中以供以后在再次迭代记录时使用。但我不确定这是否有效:
^{pr2}$另一种可能的方法是将翻译逻辑放在记录功能中:
^{3}$这可能更干净。我还没有测试。在
相关问题 更多 >
编程相关推荐