Повторное написание в выводе с использованием списка символов - python - PullRequest
0 голосов
/ 09 октября 2018

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

letters = ["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 ]

0 голосов
/ 09 октября 2018

Я думаю, вы пытаетесь заменить неоднозначные коды аминокислот 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
0 голосов
/ 09 октября 2018

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

if letters in str(record.seq):

вместо

if letter in str(record.seq)

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

...