Повторное написание в выводе с использованием списка символов - python

В файле у меня есть несколько символов для замены.

буквы = ["B", "Z", "J", "U", "O"]

for record in SeqIO.parse(inFile, "fasta"):
    for letter in letters:
        if letters in str(record.seq):
            print record.id 
            record.seq = str(record.seq).replace(letter, "X")
            outFile.write(">%s\n%s\n" % (record.description, record.seq))
        else:
            outFile.write(">%s\n%s\n" % (record.description, record.seq))
            #pass

Проблема в том, что вывод выглядит примерно так: выводим столько символов, сколько у меня есть букв:

> >ID:WP_004160595.1|Erwinia_amylovora_01SFR-BO|01SFR-BO|50S_ribosomal_protei..|630|NZ_CAPA01000010(58437):26053-26682:-1
> MIGLVGKKVGMTRIFTEDGVSIPVTVIEIEANRVTQVKGLENDGYTAIQVTTGAKKANRVTKPAAGHFAKAGVEAGRGLWEFRTAEGAEFTVGQSINVDIFADVKKVDVTGTSKGKGFAGTVKRWNFRTQDATHGNSLSHRVPGSIGQNQTPGKVFKGKKMAGQLGNERVTVQSLDVVRVDAERNLLLVKGAVPGATGSDLIVKPAVKA
> >ID:WP_004160595.1|Erwinia_amylovora_01SFR-BO|01SFR-BO|50S_ribosomal_protei..|630|NZ_CAPA01000010(58437):26053-26682:-1
> MIGLVGKKVGMTRIFTEDGVSIPVTVIEIEANRVTQVKGLENDGYTAIQVTTGAKKANRVTKPAAGHFAKAGVEAGRGLWEFRTAEGAEFTVGQSINVDIFADVKKVDVTGTSKGKGFAGTVKRWNFRTQDATHGNSLSHRVPGSIGQNQTPGKVFKGKKMAGQLGNERVTVQSLDVVRVDAERNLLLVKGAVPGATGSDLIVKPAVKA
> >ID:WP_004160595.1|Erwinia_amylovora_01SFR-BO|01SFR-BO|50S_ribosomal_protei..|630|NZ_CAPA01000010(58437):26053-26682:-1
> MIGLVGKKVGMTRIFTEDGVSIPVTVIEIEANRVTQVKGLENDGYTAIQVTTGAKKANRVTKPAAGHFAKAGVEAGRGLWEFRTAEGAEFTVGQSINVDIFADVKKVDVTGTSKGKGFAGTVKRWNFRTQDATHGNSLSHRVPGSIGQNQTPGKVFKGKKMAGQLGNERVTVQSLDVVRVDAERNLLLVKGAVPGATGSDLIVKPAVKA
> >ID:WP_004160595.1|Erwinia_amylovora_01SFR-BO|01SFR-BO|50S_ribosomal_protei..|630|NZ_CAPA01000010(58437):26053-26682:-1
> MIGLVGKKVGMTRIFTEDGVSIPVTVIEIEANRVTQVKGLENDGYTAIQVTTGAKKANRVTKPAAGHFAKAGVEAGRGLWEFRTAEGAEFTVGQSINVDIFADVKKVDVTGTSKGKGFAGTVKRWNFRTQDATHGNSLSHRVPGSIGQNQTPGKVFKGKKMAGQLGNERVTVQSLDVVRVDAERNLLLVKGAVPGATGSDLIVKPAVKA
> >ID:WP_004160595.1|Erwinia_amylovora_01SFR-BO|01SFR-BO|50S_ribosomal_protei..|630|NZ_CAPA01000010(58437):26053-26682:-1
> MIGLVGKKVGMTRIFTEDGVSIPVTVIEIEANRVTQVKGLENDGYTAIQVTTGAKKANRVTKPAAGHFAKAGVEAGRGLWEFRTAEGAEFTVGQSINVDIFADVKKVDVTGTSKGKGFAGTVKRWNFRTQDATHGNSLSHRVPGSIGQNQTPGKVFKGKKMAGQLGNERVTVQSLDVVRVDAERNLLLVKGAVPGATGSDLIVKPAVKA

2 ответа

Решение

Я думаю, что вы пытаетесь сделать, это заменить неоднозначные коды аминокислот IUPAC (плюс некоторые дополнительные буквы, которые вы каким-то образом получили?) На 'X',

Лучше использовать str.translate() (в Python 3), чтобы сделать все ваши замены одновременно. Кроме того, поскольку вы используете Biopython для чтения файла, вы также можете легко написать выходной файл с помощью Biopython.

from Bio import SeqIO
from Bio.Seq import Seq

letters = ["B", "Z", "J", "U", "O"]
trans_tab = str.maketrans(''.join(letters), 'X'*len(letters))

def yield_seqs(in_file):
    for record in SeqIO.parse(in_file, 'fasta'):
        record.seq = Seq(str(record.seq).translate(trans_tab))
        yield record

SeqIO.write(yield_seqs('input.fasta'), 'output.fasta', 'fasta')

Пример:

$ cat input.fasta 
>1
MBZJ
$ python3 myscript.py
$ cat output.fasta 
>1
MXXX

У вас есть опечатка.

if letters in str(record.seq):

вместо

if letter in str(record.seq)

Таким образом, ваша проверка всегда терпит неудачу, и печатает else часть для каждой буквы.

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