Как читать файл fasta в python?

Я пытаюсь прочитать файл FASTA, а затем найти конкретный мотив (строка) и распечатать последовательность и количество раз, когда это происходит. Файл FASTA представляет собой последовательность последовательностей (строк), которая начинается с строки заголовка, а подпись для заголовка или начала новой последовательности - ">". в новой строке сразу после заголовка будет последовательность букв. Я не делаю с кодом, но до сих пор у меня есть это, и это дает мне эту ошибку:

AttributeError: объект 'str' не имеет атрибута 'next'

Я не уверен, что здесь не так.

import re

header=""
counts=0
newline=""

f1=open('fpprotein_fasta(2).txt','r')
f2=open('motifs.xls','w')
for line in f1:
 if line.startswith('>'):
 header=line
 #print header
 nextline=line.next()
 for i in nextline:
 motif="ML[A-Z][A-Z][IV]R"
 if re.findall(motif,nextline):
 counts+=1
 #print (header+'\t'+counts+'\t'+motif+'\n')
 fout.write(header+'\t'+counts+'\t'+motif+'\n')

f1.close()
f2.close()
3 ответа

Вероятно, ошибка исходит из строки:

nextline=line.next()

line - это строка, которую вы уже прочитали, на ней нет next() метода next().

Часть проблемы состоит в том, что вы пытаетесь смешивать два разных способа чтения файла - вы выполняете итерацию по строкам, используя for line in f1 и <handle>.next()</handle>.

Кроме того, если вы работаете с файлами FASTA, я рекомендую использовать Biopython: он упрощает работу с коллекциями последовательностей. В частности, глава 14 по мотивам будет представлять для вас особый интерес. Это, скорее всего, потребует, чтобы вы больше узнали о Python, чтобы достичь того, чего вы хотите, но если вы собираетесь делать намного больше биоинформатики, чем то, что показывает ваш пример, то это определенно стоит инвестиций времени.


Это может помочь вам в правильном направлении

import re

def parse(fasta, outfile):
 motif = "ML[A-Z][A-Z][IV]R"
 header = None
 with open(fasta, 'r') as fin, open(outfile, 'w') as fout:
 for line in fin:
 if line.startswith('>'):
 if header is not None:
 fout.write(header + '\t' + str(count) + '\t' + motif + '\n')
 header = line
 count = 0
 else:
 matches = re.findall(motif, line)
 count += len(matches)
 if header is not None:
 fout.write(header + '\t' + str(count) + '\t' + motif + '\n')
if __name__ == '__main__':
 parse("fpprotein_fasta(2).txt", "motifs.xls")


Я не уверен в том, что касается макаронных изделий, но я уверен, что вы сделали не так:

nextline=line.next()

строка просто str, поэтому вы не можете вызвать str.next()

Кроме того, в отношении файлов рекомендуется использовать:

with open('fpprotein_fasta(2).txt','r') as f1:

Это будет автоматически закрывать файл.

Вам рекомендуется предоставить образец файла fasta, чтобы я мог попытаться исправить код.

licensed under cc by-sa 3.0 with attribution.