我想制作一个Python程序,其中在文本文件中给出DNA序列。它有超过9000个字符。我必须将序列剪成 3 个字符
所以我们的框架从1到3
读取,然后4到6,
然后7到9
,这被称为密码子。
例如,序列是
ACCTGCCTCTTACGAGGCGACACTCCACCATGGATCACTCCCCTGTGAGGAACTACTGTCTTCACGCAGA
那么我必须把它剪成3个字符。我已经做到了。我的问题是如何从给定的 DNA 中取出 GENE 序列? GENE 序列从 ATG
开始,到 TAG
或 TAA
或 TGA
结束。
如果我使用正则表达式
,这很容易做到。但问题是,如果你看一下上面的序列,ATG
就会从第 30 位上升到第 32 位。我们的框架从 1 到 3
读取,然后从 4 到 6
读取。在这种情况下,当它达到28 到 30
时,它不会生成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")
最佳答案
像这样循环 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)
关于python - 使用 block 切割 DNA 序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52870107/