在字符串中查找基序和删除目标序列的 Biopython 问题
Biopython issue in finding motifs in strings and deleting target sequence
你好,我有一个很大的 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))
然而 return 我只知道图案开始位置的信息,11 TTTCCC
我还想 return 找到它的序列的信息:
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")
我无法在本地测试这个,但我会用一些代码来解释你如何解决这个问题。
如果文件结构如您所提到的,那么您可以得出的一点是,在检查实例的地方,它们发生在偶数行上(比如 n
),它们代表的序列只是 n-1
。因此,为了让您以这种格式输出 EMBOSS_001 11 TTTCCC
- 最简单的方法是使用索引 i
作为计数器并确定序列。
例如:reads[i-1]
将为您提供 FASTA GTCATCACAGTTTTCCCCGCCCTGTATATGGCTAATAGGCCCTCGCAATCTCCGATAAAT
的序列 >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()
方法。
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")
我已经设法想出了这样的方法
你好,我有一个很大的 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))
然而 return 我只知道图案开始位置的信息,11 TTTCCC 我还想 return 找到它的序列的信息: 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")
我无法在本地测试这个,但我会用一些代码来解释你如何解决这个问题。
如果文件结构如您所提到的,那么您可以得出的一点是,在检查实例的地方,它们发生在偶数行上(比如 n
),它们代表的序列只是 n-1
。因此,为了让您以这种格式输出 EMBOSS_001 11 TTTCCC
- 最简单的方法是使用索引 i
作为计数器并确定序列。
例如:reads[i-1]
将为您提供 FASTA GTCATCACAGTTTTCCCCGCCCTGTATATGGCTAATAGGCCCTCGCAATCTCCGATAAAT
的序列 >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()
方法。
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")
我已经设法想出了这样的方法