嗨,我有一个很大的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")发布于 2020-11-22 23:13:32
我不能在本地测试这个问题,但是我将用一些代码解释如何解决这个问题。
如果文件结构如您所提到的,那么您可以导出的一点是,在检查实例的地方,它们发生在一条偶数行(例如n)上,它们所代表的序列只是n-1。因此,为了以这种格式输出EMBOSS_001 11 TTTCCC,最简单的方法是使用索引i作为计数器并确定顺序。
例如:reads[i-1]将为FASTA GTCATCACAGTTTTCCCCGCCCTGTATATGGCTAATAGGCCCTCGCAATCTCCGATAAAT提供序列>EMBOSS_001。若要删除>,请将其设置为reads[i-1][1:]。
要消除motif TTTCCC时的seq,有许多方法可以做到这一点。最简单的方法是对python对象使用del方法。这将简单地删除发生motif的序列和元素。
这可以很容易地完成,这就是您的代码中更改的方式。
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]希望这能解决这个问题。如果你遇到任何错误,请告诉我。
编辑:,我最初的写作意图应该是这样的--还添加了一个中断语句,看看它是否解决了问题。
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()方法。
发布于 2020-11-25 12:06:29
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")我已经想出了这样的方法
https://stackoverflow.com/questions/64956923
复制相似问题