将 RNA 序列翻译为相应的蛋白质序列
写在前面的话:
本人是一枚生物学的学生,由于对生物信息学特别感兴趣,于是想自学生物信息学(新手莫怪)。了解到生物信息学要有编程基础,尤其是要会一门编程语言,例如:R语言、Python、Perl等,还要熟悉Linux系统,作为生信小白,听说Python挺简单的,于是就自学了Python,花了两天时间了解了Python的基础语法后,今天想做个练习题试试手(实践是检验真理的唯一标准),下面是练习题:(试题来源:《PYTHON生物信息学数据管理》)
假设有一条或更多 RNA 序列,读者想使用代表遗传密码的密码子表将它们翻译成相应 的蛋白质序列 。
这就需要从文件中读取 RNA 序列(在下文中称为"A06662_RNA. fasta") ,例如, FASTA 格式:
>A06662.1 Synthetic nucleotide seguence of the human GSH
transferase pi gene
UGGGACCAGUCAGCAGAGGCAGCGUGUGUGCGCGUGCGUGUGCGUGUGUGUGCGUGUGUGUG
UGUACGCUUGCAUUUGUGUCGGGUGGGUAAGGAGAUAGAGAUGGGCGGGCAGUAGGCCCAGG
UCCCGAAGGCCUUGAACCCACUGGUUUGGAGUCUCCUAAGGGCAAUGGGGGCCAUUGAGAAG
UCUGAA. . .
一次要读三个字符的 RNA 序列,对于每组三个字符(即密码子) ,相应的氨基酸必须能在遗传密码中找到,用于终止或截短密码子(分别是' * '和' - '的特殊字符也需要考虑。 每个阅读框都应重复这个过程,即:先从RNA序列的第一个核昔酸开始,然后从第二个开始,最后是第三个。实践程序时,读者需要查询大量的密码子:找到密码子对应到氨基酸。直觉来看,可以使用 for 循环来搜索密码子以及列表中相应的氨基酸:
genetic_code = [( 'GCU ' , 'A') , ('GCC' , ' A') ,…]
for codon, amino_acid in genetic_code:
if codon == triplet:
seq = seq + amino_ acid
虽然这个搜索模式可以运行,但会非常没有效率。 如果序列很长,程序很快就会变得非常缓慢。
最好有一种数据结构,可以对一个遗传密码子的碱基三联体直接查找到相应的氨基酸,这样就可以特定地提取 {密码子:氨基酸} 的对应,而无须每次都遍历整个数据结构。
则脚本程序为:
codon_table = {'GCU':'A','GCC':'A','GCA':'A','GCG':'A',
'CGU':'R','CGC':'R','CGA':'R','CGG':'R','AGA':'R','AGG':'R',
'UCU':'S','UCC':'S','UCA':'S','UCG':'S','AGU':'S','AGC':'S',
'AUU':'I','AUC':'I','AUA':'I','AUU':'I','AUC':'I','AUA':'I',
'UUA':'L','UUG':'L','CUU':'L','CUC':'L','CUA':'L','CUG':'L',
'GGU':'G','GGC':'G','GGA':'G','GGG':'G',
'GUU':'V','GUC':'V','GUA':'V','GUG':'V',
'ACU':'T','ACC':'T','ACA':'T','ACG':'T',
'CCU':'P','CCC':'P','CCA':'P','CCG':'P',
'AAU':'N','AAC':'N',
'GAU':'D','GAC':'D',
'UGU':'C','UGC':'C',
'CAA':'Q','CAG':'Q',
'GAA':'E','GAG':'E',
'CAU':'H','CAC':'H',
'AAA':'K','AAG':'K',
'UUU':'F','UUC':'F',
'UAU':'Y','UAC':'Y',
'AUG':'M',
'UGG':'W',
'UAG':'STOP','UGA':'STOP','UAA':'STOP'}
RNA = ''
for line in open('C:/Users/程云伟/Desktop/A06662_RNA.fasta'):
#print(line)
if not line.startswith('>'):
RNA = RNA+line.strip()
#print(RNA)
#translate one frame at a time
for frame in range(4):
prot = ''
print('Reading frame'+ str(frame + 1))
for i in range(frame,len(RNA),3):
codon = RNA[i:i+3]
#print(codon)
if codon in codon_table:
if codon_table[codon] =='STOP':
prot = prot +'*'
else:
prot = prot+codon_table[codon]
#print(prot)
else:
#handle too short codons
prot = prot+'-'
#format to blocks of 48 columns
i = 0
while i < len(prot):
print(prot[i:i+48])
i = i+48
上面的脚本把遗传密码在字典中存储为{密码子:氨基酸}这样的对,读取 FASTA 文件的RNA序列作为字符串,然后翻译序列。该程序以三个字符(核苷酸三联体)为步长遍历了 RNA 字符串,并将每个核苷酸三联体替换为相应的氨基酸,将其添加至新的蛋白质字符串中,最终蛋白质字符串会打印到屏幕上,每个阅读框都会重复这些步骤。 打印 48 个氨基酸的输出块时,可以用 while 循环来代替 for 循环。 while 循环会执行一组语句,直到满足了给定的条件。 在上面的脚本中,条件是 i < len(prot) (直到整个序列被写入之前,该条件都会为 True) 。 但一旦索引变量 i 超过长度序列,条件就为 False, 并退出循环。
日常结尾:
虽然这是个小小的计算程序,但对于初学者的我来说每一次对原代码的升级改造,哪怕是读懂后的注释都感觉是一次进步提升,总之代码虽小,动手最重要!希望更多学习Python的爱好者不要像我一样眼高手低,学习编程就是要,思考,敲码,思考,敲码,敲码,再敲码!