Biopython在查找字符串中的基序和删除目标序列时遇到的问题

2024-09-30 20:20:03 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我有一个大的FASTA文件,看起来像这样

>EMBOSS_001
GTCATCACAGTTTTCCCCGCCCTGTATATGGCTAATAGGCCCTCGCAATCTCCGATAAAT
>EMBOSS_002
CTGATGCTAGTCCCGTGTCCCAAACACTTCCGCAGAAGATCGCCCCGGGGGGCGTGTACC
>EMBOSS_003
CGCGCATGGACTCCATCCGTGATCTTTTGAGGCCATGAGTCCAAGTTTACCTCGGATATA
>EMBOSS_004
CGACCCGCCATTCTCCATCGTAACTTAGTCACGACGACAGTCAGCTTGTTCGTTCGTTAT

我想找到所有具有特定主题的序列并消除它们 例如,如果motif为TTTCCC,则预期输出应为:

>EMBOSS_002 CTGATGCTAGTCCCGTGTCCCAAACACTTCCGCAGAAGATCGCCCCGGGGGGCGTGTACC
>EMBOSS_003 CGCGCATGGACTCCATCCGTGATCTTTTGAGGCCATGAGTCCAAGTTTACCTCGGATATA
>EMBOSS_004 CGACCCGCCATTCTCCATCGTAACTTAGTCACGACGACAGTCAGCTTGTTCGTTCGTTAT

我用Biopython写了一段代码:

from Bio.Seq import Seq
import Bio.motifs as motifs
from Bio import SeqIO

instances = [Seq("TTTCCC")]
m = motifs.create(instances)

reads = list(SeqIO.parse("/Users/EMBOSS-6.6.0/emboss/genome.fa", "fasta"))

for i in range(len(reads)):
    for pos, seq in m.instances.search(reads[i].seq):
        print("%i %s" % (pos, seq))

然而,它只返回主题开始位置的信息,11 TTTCCC 我想返回找到它的序列的信息: 压花_001 11 TTTCCC 此外,我希望代码能够消除发现模体的序列

此外,我无法删除找到motif的字符串并将其写入输出

for i in range(len(reads)):
    for pos, seq in m.instances.search(reads[i].seq):
        print(" %s %i %s" % (reads[i - 0][1:], pos, seq))
        del reads[i - 0:i]
        SeqIO.write(reads, "/Users/EMBOSS-6.6.0/emboss/results6.fa", "fasta")

Tags: instancesinposimportfor序列seqbio
2条回答
for i in range(len(reads)):
    for pos, seq in m.instances.search(reads[i].seq):
        seq_rem = str(" %s %i %s" % (reads[i - 0][1:], pos, seq))
        reads_dict = SeqIO.to_dict(reads)
        seq_rem = seq_rem.splitlines()[0][5:]
del reads_dict[seq_rem]
SeqIO.write(reads_dict.values(), "/Users/EMBOSS-6.6.0/emboss/results10.fa", "fasta")

我已经设法想出了这样的办法,效果很好

我无法在本地测试这个问题,但我将用一些代码解释如何着手解决这个问题

如果文件结构如您所述,那么您可以得出的一点是,在检查实例的地方,它们发生在偶数行上(例如n),它们所表示的序列只是n-1。因此,为了以这种格式输出EMBOSS_001 11 TTTCCC,最简单的方法是使用索引i作为计数器并确定序列

例如:reads[i-1]将为FASTAGTCATCACAGTTTTCCCCGCCCTGTATATGGCTAATAGGCCCTCGCAATCTCCGATAAAT提供序列>EMBOSS_001。要删除>,请将其设置为reads[i-1][1:]

要在发现motif TTTCCC时消除seq,有很多方法可以做到这一点。最简单的方法是对python列表对象使用del方法。这将简单地删除序列和基序出现的元素

这很容易做到,这就是代码中的更改

for pos, seq in m.instances.search(reads[i].seq):
        print(" %s %i %s" % (reads[i-1][1:],pos, seq))#should print in format EMBOSS_001 11 TTTCCC
        del reads[i-1:i]

这有望解决问题。如果您遇到任何错误,请告诉我

编辑: 我最初的写作意图应该是这样的——我还添加了一个break语句,看看它是否解决了问题

for i in range(len(reads)):
    for pos, seq in m.instances.search(reads[i].seq):
        print(" %s %i %s" % (reads[i - 0][1:], pos, seq))
        del reads[i - 0:i]
        break 
SeqIO.write(reads, "/Users/EMBOSS-6.6.0/emboss/results6.fa", "fasta")

一旦发现了这些图案,就会消除这个序列。这意味着现在只应将没有基序的字符串写入SeqIO.write()方法

相关问题 更多 >