Разбор многострочного файла fasta с использованием record.id для имен файлов, но не для заголовков - PullRequest
0 голосов
/ 04 ноября 2018

Мой текущий многострочный файл fasta таков:

>chr1|chromosome:Mt4.0v2:1:1:52991155:1
ATGC...

>chr2|chromosome:Mt4.0v2:2:1:45729672:1
ATGC...

... и т. Д.

Мне нужно разобрать файл fasta в отдельные файлы, содержащие только заголовок record.description (все после |), за которым следует последовательность. Однако мне нужно использовать record.ids в качестве имен файлов (chr1.fasta, chr2.fasta и т. Д.). Есть какой-либо способ сделать это?

Моя текущая попытка решить эту проблему приведена ниже. Он производит только описание в заголовке с последней последовательностью record.id в качестве имени файла. Мне нужны отдельные файлы.

from Bio import SeqIO

def yield_records(in_file):
    for record in SeqIO.parse(in_file, 'fasta'):
        record.description = record.id = record.id.split('|')[1]
        yield record

SeqIO.write(yield_records('/correctedfasta.fasta'), record.id+'.fasta', 'fasta')

1 Ответ

0 голосов
/ 04 ноября 2018

В вашем коде есть почти все, что нужно. yield также может возвращать более одного значения, т. Е. Вы можете вернуть и имя файла, и саму запись, например,

yield record.id.split('|')[0], record

но тогда BioPython все равно укусит вас, потому что id записывается в заголовок FASTA. Поэтому вам необходимо изменить и id, и перезаписать description (в противном случае он объединяется с id), или просто назначить идентичные значения, как вы это сделали.

Простое решение будет

from Bio import SeqIO

def split_record(record):
    old_id = record.id.split('|')[0]
    record.id = '|'.join(record.id.split('|')[1:])
    record.description = ''
    return old_id, record

filename = 'multiline.fa'

for record in SeqIO.parse(filename, 'fasta'):
    record = split_record(record)
    with open(record[0] + '.fa', 'w') as f:
        SeqIO.write(record[1], f, 'fasta')
...