Это то, что вы хотите?
#!/usr/bin/env python
import sys
import os
from collections import defaultdict
myfasta = sys.argv[1]
with open(myfasta) as fasta:
data = fasta.read().splitlines()
pattern_data = defaultdict(list)
index = 0
while index < len(data):
if data[index].startswith('>'):
start = data[index].index('_') + 1
key = data[index][start:]
pattern_data[key].append(data[index + 1])
index += 2
На этом этапе вы можете делать все что угодно с отсортированными данными.
Вышеприведенное предполагает, что весь файл, который вы анализируете, соответствует точному формату, показанному выше: 1 строка, начинающаяся с ">", это идентификатор единственной строки, которая следует. Если у вас есть несколько строк, которые следуют, код нуждается в незначительной модификации.
EDIT:
Я только что прочитал о файлах фаста. Теперь я знаю, что на самом деле они могут иметь последовательности, длина которых превышает одну строку после их идентификации. Поэтому приведенный выше код необходимо модифицировать для учета многострочных последовательностей. Более обобщенный подход заключается в следующем:
#!/usr/bin/env python
import sys
import os
from collections import defaultdict
myfasta = sys.argv[1]
with open(myfasta) as fasta:
data = fasta.read().splitlines()
id_line_indices = [index for index, line in enumerate(data) if line.startswith('>')]
id_line_indices.append(len(data))
pattern_buckets = defaultdict(list)
i = 0
while i < len(id_line_indices) - 1:
start = data[id_line_indices[i]].index('_') + 1
key = data[id_line_indices[i]][start:]
sequence = [data[index] for index in range(id_line_indices[i] + 1, id_line_indices[i + 1])]
sequence = ''.join(sequence)
pattern_buckets[key].append(sequence)
i += 1
Это все еще дает те же результаты для вышеуказанного набора данных. Например,
print(pattern_buckets['CDS'])
print(pattern_buckets['rRNA'])
Получит вас:
['AAAAATTTCTGGGCCCCGGGGG', 'TTAAAAATTTCTGGGCCCCGGGAAAAAA', 'TTTGGGAATTAAACCCT', 'TTTGGGAATTAAACCCT']
['TTAAAAATTTCTGGGCCCCGGGAAAAAA']