【问题标题】:Biopython issue in finding motifs in strings and deleting target sequenceBiopython 在字符串中查找基序和删除目标序列的问题
【发布时间】:2020-11-25 20:15:09
【问题描述】:

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

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

我想找到所有具有特定主题的序列并消除它们 例如,如果主题是 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 我还想返回找到它的序列的信息: EMBOSS_001 11 TTTCCC 此外,我希望代码能够消除发现主题的那个序列。

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

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")

【问题讨论】:

    标签: python biopython


    【解决方案1】:

    我无法在本地对此进行测试,但我会用一些代码说明如何解决这个问题。

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

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

    要在找到主题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() 方法。

    【讨论】:

    • 嗨,谢谢,它有点工作,但我不得不改为 i-0 而不是 i-1 因为它指向我认为的以下序列的 ID。
    • 顺便说一句,如果我想写入一个新文件的输出,我需要使用 seqIO.write 吗?
    • 是的,我用 seqIO.write 写了一个 fasta 文件,在删除了你说的找到motif但序列没有被删除的序列后
    • 是的,I-1 指向的是文件的最后一个序列
    • @PaoloLorenzini 我认为您可以使用seqIO.write 来编写输出。如果序列出现在写入文件中,那么这可能是因为您可能在删除序列之前写入文件。你能再问一个关于你是如何写这篇文章的问题并在这里@我吗?
    【解决方案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")
    

    我已经设法想出了这样的方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      • 1970-01-01
      • 2019-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多