我想制作一个Python程序,其中在文本文件中给出DNA序列。它具有9000多个字符。我必须将序列切成3个字符
因此我们的框架从1 to 3
开始读取,然后从4 to 6,
开始,然后从7 to 9
开始读取,这被称为密码子。
例如,序列为
ACCTGCCTCTTACGAGGCGACACTCCACCATGGATCACTCCCCTGTGAGGAACTACTGTCTTCACGCAGA
然后我必须将其切成3个字符。我已经做到了。我的问题是如何从给定的DNA中提取基因序列? GENE序列从ATG
开始,并在TAG
或TAA
或TGA
处结束。
如果我使用Regular Expression
,这很容易做到。但是问题是,如果您查看以上序列,ATG
从第30位到第32位。当我们的框架从1 to 3
开始读取,然后从4 to 6
开始读取。在这种情况下,当到达28th to 30th
时,它不会变成ATG
。
谁能理解我的问题,请帮助我?我现在正在共享我的代码:
import numpy as np
import pandas as pd
import re
from pathlib import Path
dna = Path('C:/Users/abdul/Downloads/Compressed/MAJU/HCV-PK1-sequence -
edited.txt').read_text()
l = [c for c in dna if c!='\n']
r = len(l)
for x in range(0,r,3):
y=x+3
codon = l[x:y]
a = ''.join(codon)
print(a)
if(a == re.findall('ATG(...)+?(TAG|TAA|TGA)', dna)):
print("Yes")
答案 0 :(得分:0)
然后只需更改帧范围以便从1 to 3
,2 to 4
等进行读取。
您可以将slicing
功能与range
功能结合使用。
dna = "ACCTGCCTCTTACGAGGCGACACTCCACCATGGATCACTCCCCTGTGAGGAACTACTGTCTTCACGCAGA"
sequence_length = 3
lst = [dna[i:i+sequence_length] for i in range(0, len(dna) - sequence_length + 1, 1)]
输出
=> ['ACC', 'CCT', 'CTG', 'TGC', 'GCC', 'CCT', 'CTC', 'TCT', 'CTT', 'TTA', 'TAC', 'ACG', 'CGA', 'GAG', 'AGG', 'GGC', 'GCG', 'CGA', 'GAC', 'ACA', 'CAC', 'ACT', 'CTC', 'TCC', 'CCA', 'CAC', 'ACC', 'CCA', 'CAT', 'ATG', 'TGG', 'GGA', 'GAT', 'ATC', 'TCA', 'CAC', 'ACT', 'CTC', 'TCC', 'CCC', 'CCC', 'CCT', 'CTG', 'TGT', 'GTG', 'TGA', 'GAG', 'AGG', 'GGA', 'GAA', 'AAC', 'ACT', 'CTA', 'TAC', 'ACT', 'CTG', 'TGT', 'GTC', 'TCT', 'CTT', 'TTC', 'TCA', 'CAC', 'ACG', 'CGC', 'GCA', 'CAG', 'AGA']
答案 1 :(得分:0)
像这样环绕3个阅读框:
dna = ''.join(dna)
for frame in [0,1,2]:
codons = [dna[x:x+3] for x in range(frame,len(dna)-2,3)]
但是正确的答案是安装biopython并使用其序列操作功能。它还将帮助您从文件中读取序列。
不使用biopython的解决方案:
def find_orf(seq,start):
for pos in range(start+3,len(seq)-2,3):
codon = seq[pos:pos+3]
if codon in ['TAA','TAG','TGA']:
return seq[start:pos+3]
return seq[start:] # if we don't find inframe stop codon return whole sequence from start codon to end
# Assuming seq is a string, not a list of characters:
seq = 'ACCTGCCTCTTACGAGGCGACACTCCACCATGGATCACTCCCCTGTGAGGAACTACTGTCAGCCTAATTAATAAGGTAAC'
orfs = []
for frame in [0,1,2]:
for pos in range(frame,len(seq)-2,3):
codon = seq[pos:pos+3]
if codon == 'ATG':
orf = find_orf(seq,pos)
orfs.append(orf)
print(orfs)