Пишите несколько записей в фасте, используя scikit-bio write

Я пытаюсь прочитать записи файла FASTA, используя scikit-bio, а затем записать определенные записи обратно в другой файл, если он удовлетворяет некоторым требованиям. Проблема, с которой я сталкиваюсь, заключается в том, что .write методы, кажется, открывают и закрывают файл, поэтому каждая запись перезаписывает предыдущую.

In [39]: f = 'seqs.fna'
         seqs = skbio.io.read(f, format='fasta')
         for seq in seqs:
             if seq.metadata['id'] in ['47P50SDHBQ1PA_0', '4OZ9UI889OL5V_1', '2EC8VWHQD1LW5_2']:
                 print('True')
                 seq.write('foo.txt')

True
True

Я надеюсь, что в этом случае две записи будут написаны foo.txt однако присутствует только последняя запись. Как я могу записать все последовательности, соответствующие моим критериям, в файл?

1 ответ

Решение

Запишите в тот же открытый файл вместо указания пути к файлу:

with open('output.fna', 'w') as output_fh:
    for seq in skbio.io.read('seqs.fna', format='fasta'):
        if seq.metadata['id'] in ['47P50SDHBQ1PA_0', '4OZ9UI889OL5V_1', '2EC8VWHQD1LW5_2']:
            seq.write(output_fh)

В качестве альтернативы вы можете использовать skbio.io.write написать генератор последовательностей:

def filtered_seqs():
    for seq in skbio.io.read('seqs.fna', format='fasta'):
        if seq.metadata['id'] in ['47P50SDHBQ1PA_0', '4OZ9UI889OL5V_1', '2EC8VWHQD1LW5_2']:
            yield seq

skbio.io.write(filtered_seqs(), format='fasta', into='output.fna')
Другие вопросы по тегам