#python #biopython
#python #biopython
Вопрос:
Привет, у меня есть большой файл 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
Кроме того, я хотел бы, чтобы код исключал ту последовательность, в которой был найден мотив.
Кроме того, я не могу удалить строку, в которой был найден мотив, и записать ее в output
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")
Ответ №1:
Я не могу протестировать это локально, но я объясню с помощью некоторого кода, как вы можете решить эту проблему.
Если структура файла такая, как вы упомянули, то одна из точек, которые вы можете вывести, заключается в том, что там, где проверяются экземпляры, они происходят на четной строке (скажем n
), и какую последовательность они представляют, это просто n-1
. Итак, для того, чтобы вы могли выводить в этом формате EMBOSS_001 11 TTTCCC
, самый простой способ — использовать индекс i
в качестве счетчика и определить последовательность.
Например: reads[i-1]
даст вам последовательность >EMBOSS_001
для FASTA GTCATCACAGTTTTCCCCGCCCTGTATATGGCTAATAGGCCCTCGCAATCTCCGATAAAT
. Чтобы удалить >
, установите для него значение reads[i-1][1:]
.
Чтобы устранить seq при TTTCCC
обнаружении мотива, есть много способов сделать это. Самым простым было бы использовать del
метод для объектов списка python. Это просто удалит последовательность и элемент, в котором встречается мотив.
Это можно сделать легко, и вот как это изменение будет выглядеть в вашем коде
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()
.
Комментарии:
1. привет, спасибо, это вроде сработало, но мне пришлось изменить на i-0 вместо i-1, потому что он указывал на ИДЕНТИФИКАТОР следующей последовательности, я думаю.
2. кстати, если я хочу записать в новый файл вывод, нужно ли мне использовать SeqIO.write?
3. да, я использовал SeqIO.write для записи файла fasta после удаления последовательности, в которой мотив был найден, как вы сказали, но последовательность не была удалена
4. да, вместо этого I-1 указывал на последнюю последовательность файла
5. @PaoloLorenzini Я думаю, вы можете использовать
seqIO.write
для записи выходных данных. Если последовательность появляется в файле записи, то это может быть связано с тем, что вы, возможно, записываете файл до удаления последовательности. Можете ли вы задать еще один вопрос о том, как вы пишете это и @ me здесь?
Ответ №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")
Мне удалось придумать что-то подобное, что работает