В вашем коде есть почти все, что нужно. 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')