长度非3倍数的DNA序列如何用自定义密码子表翻译为氨基酸序列
非3整数倍长度序列的处理方案
- 优先选择截取末尾冗余碱基:针对NNK简并密码子文库场景,非3倍数长度的序列多为测序错误或拼接异常产物,本身属于移码无效序列,直接截去末尾不足3个的碱基是行业通用处理方式,不会影响有效序列的后续分析。
- 若需保留全长度信息,可使用
X作为占位符补充末尾不足3个的部分,翻译时遇到含非ATCG碱基的密码子统一对应X即可,该方案适合需要统计序列长度分布的分析场景。
代码逻辑问题
- 长度判断位置错误:将
len(dna) % 3 == 0的判断放在密码子遍历循环内部,导致只要序列长度不是3的倍数,整条序列都不会被翻译,而非仅跳过末尾不满足长度的部分。 - 结果追加位置错误:
nnn_aa_seq.append(protein_seq)被放在内部密码子循环中,每处理一个密码子就追加一次未完成的蛋白序列,导致大量重复中间结果被写入列表。 - 输出格式不符合预期:最后用
"".join(nnn_aa_seq)把所有结果拼接为单个字符串,自然无法和原序列一一对应。 - 拼写错误:打印语句中将
translate_nnn写为tranlate_nnn,会直接触发变量未定义报错。
修正后可运行代码
input_file = 'inserts.txt' with open(input_file, 'r') as f: seq_list = f.readlines() # 清理无效字符 seq_list = [s.replace(" ", "").replace(",", "").replace("'", "").replace("\n", "").strip() for s in seq_list] # 过滤空行 seq_list = [s for s in seq_list if s] print("\n".join(seq_list[:99])) print("\n序列列表类型", type(seq_list)) # 自定义翻译函数 def translate(seq_list): nnn_table = {'TTT': 'F', 'TCT': 'S', 'TAT': 'Y', 'TGT': 'C', 'TTC': 'F', 'TCC': 'S', 'TAC': 'Y', 'TGC': 'C', 'TTA': 'L', 'TCA': 'S', 'TAA': '*', 'TGA': '*', 'TTG': 'L', 'TCG': 'S', 'TAG': '*', 'TGG': 'W', 'CTT': 'L', 'CCT': 'P', 'CAT': 'H', 'CGT': 'R', 'CTC': 'L', 'CCC': 'P', 'CAC': 'H', 'CGC': 'R', 'CTA': 'L', 'CCA': 'P', 'CAA': 'Q', 'CGA': 'R', 'CTG': 'L', 'CCG': 'P', 'CAG': 'Q', 'CGG': 'R', 'ATT': 'I', 'ACT': 'T', 'AAT': 'N', 'AGT': 'S', 'ATC': 'I', 'ACC': 'T', 'AAC': 'N', 'AGC': 'S', 'ATA': 'I', 'ACA': 'T', 'AAA': 'K', 'AGA': 'R', 'ATG': 'M', 'ACG': 'T', 'AAG': 'K', 'AGG': 'R', 'GTT': 'V', 'GCT': 'A', 'GAT': 'D', 'GGT': 'G', 'GTC': 'V', 'GCC': 'A', 'GAC': 'D', 'GGC': 'G', 'GTA': 'V', 'GCA': 'A', 'GAA': 'E', 'GGA': 'G', 'GTG': 'V', 'GCG': 'A', 'GAG': 'E', 'GGG': 'G'} aa_seq_list = [] print("\nStarting to translate:") for dna in seq_list: protein_seq = "" # 直接遍历到最大的3的整数倍位置,自动截去末尾冗余 for i in range(0, len(dna) - len(dna) % 3, 3): codon = dna[i:i+3] # 加入容错逻辑,遇到无法匹配的密码子返回X占位符 protein_seq += nnn_table.get(codon, 'X') aa_seq_list.append(protein_seq) # 返回和原序列一一对应的氨基酸列表 return aa_seq_list translate_nnn = translate(seq_list) # 打印前10条对应结果验证 for dna, aa in zip(seq_list[:10], translate_nnn[:10]): print(f"DNA: {dna}\nAA: {aa}\n---") # 后续可自行将translate_nnn写入输出文件
内容的提问来源于stack exchange,提问作者new bioinfomatics guy
相关产品推荐
相关产品推荐

