繁体   English   中英

使用大块切片DNA序列

[英]Slicing DNA sequence using chunks

我想制作一个Python程序,其中在文本文件中给出了DNA序列。 它具有9000多个字符。 我必须将序列切成3个字符,以便我们的帧从1 to 3读取,然后从4 to 6,读取4 to 6,然后从7 to 9读取,这称为密码子。

例如,序列是

ACCTGCCTCTTACGAGGCGACACTCCACCATGGATCACTCCCCTGTGAGGAACTACTGTCTTCACGCAGA

然后我必须将其切成3个字符。 我已经做到了。 我的问题是如何从给定的DNA中提取基因序列? GENE序列从ATG开始,并在TAGTAATGA

如果我使用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")

然后只需更改帧范围即可从1 to 3读取1 to 3 ,从2 to 4读取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']

像这样循环遍历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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM