Замените FASTA seq_ID новым идентификатором из dict, используя BioPython

У меня есть большой файл с множеством последовательностей FASTA. Некоторые из них необходимо переименовать - я пытаюсь заменить идентификаторы последовательности FASTA на их обновленную версию. Я сохранил информацию в словаре таким образом, что старый идентификатор является ключом, а новый идентификатор является значением. Независимо от того, что я делаю, я не могу ни заменить идентификаторы, ни правильно написать новый файл fasta. Я использую SeqIO для чтения в моем файле fasta. Вот часть моего кода:

Это приводит к поверхностной замене идентификаторов записей, поскольку они печатаются здесь точно, но фактически не изменяются в самом файле:

rename_fastas = {'446_was_445_cDNA_v01VT':'446_cDNA_v01VT', '446_was_445_cDNA_v03VT': '446_cDNA_v03VT', 
             '428PBMC_2_V3': '428_PBMC_2_V3', '428PBMC_3_V3': '428_PBMC_3_V3', '428PBMC_4_V3': '428_PBMC_4_V3', '428PBMC_5_V3': '428_PBMC_5_V3'}

with open('fasta.fsa') as f:
    for seq_record in SeqIO.parse(f, 'fasta'):
        for k,v in rename_fastas.items():
            if seq_record.id == k:
                seq_record.id = seq_record.description = seq_record.id.replace(k,v)
                print(seq_record.id)

это дало мне слишком много записей в моем новом файле:

with open('fasta.fsa') as original, 
open('fasta2.fsa', 'w') as corrected:
    records = SeqIO.parse(original, 'fasta')
    for record in records:
        for k, v in rename_fastas.items():
            if record.id == k:
                record.id = record.description.replace(k, v)
            else: 
                record.id = record.id
            SeqIO.write(record, corrected, 'fasta')

это также не сработало, и я не уверен, почему:

with open('fasta.fsa') as f:
    for seq_record in SeqIO.parse(f, 'fasta'):
        seq_record.id = seq_record.description = seq_record.id.replace('428PBMC','428_PBMC')
        seq_record.id = seq_record.description = seq_record.id.replace('446_was_445','446')
        yield seq_record

Любая помощь будет оценена!

1 ответ

Решение

Попробуйте это:

rename_fastas = {'446_was_445_cDNA_v01VT':'446_cDNA_v01VT', '446_was_445_cDNA_v03VT': '446_cDNA_v03VT', '428PBMC_2_V3': '428_PBMC_2_V3', '428PBMC_3_V3': '428_PBMC_3_V3', '428PBMC_4_V3': '428_PBMC_4_V3', '428PBMC_5_V3': '428_PBMC_5_V3'}

with open('fasta.fsa') as original, open('fasta2.fsa', 'w') as corrected:
    for seq_record in SeqIO.parse(original, 'fasta'):
        if seq_record.id in rename_fastas:
            seq_record.id = seq_record.description = rename_fastas[seq_record.id]
        SeqIO.write(seq_record, corrected, 'fasta')

Вы открываете файлы для ввода и вывода. У вас есть диктат с правильными ключами, поэтому нет необходимости каждый раз проходить его, просто попросите диктовку выполнить свою работу и получить к нему доступ через свои ключи. Если ключ присутствует в dict, замените все значение идентификатора значением в dict. Наконец, запишите исправленную запись в выходной файл.

Другие вопросы по тегам