2015-09-01 1 views
2

У меня есть следующий FASTA файл, original.fasta:Изменение идентификатора записи в файл FASTA с помощью BioPython

>foo 
GCTCACACATAGTTGATGCAGATGTTGAATTCACTATGAGGTGGGAGGATGTAGGGCCA 

Мне нужно изменить идентификатор записи из foo в bar, поэтому я написал следующий код:

from Bio import SeqIO 

original_file = r"path\to\original.fasta" 
corrected_file = r"path\to\corrected.fasta" 

with open(original_file) as original, open(corrected_file, 'w') as corrected: 
    records = SeqIO.parse(original_file, 'fasta') 
    for record in records: 
     print record.id    # prints 'foo' 
     if record.id == 'foo': 
      record.id = 'bar' 
     print record.id    # prints 'bar' as expected 
     SeqIO.write(record, corrected, 'fasta') 

Мы напечатали идентификатор записи до и после изменения и получили ожидаемый результат. Мы даже можем перепроверить, прочитав в исправленном файле снова BioPython и распечатав Индентификационный:

with open(corrected_file) as corrected: 
    for record in SeqIO.parse(corrected, 'fasta'): 
     print record.id     # prints 'bar', as expected 

Однако, если мы открываем исправленный файл в текстовом редакторе, мы видим, что идентификатор записи не bar но bar foo:

>bar foo 
GCTCACACATAGTTGATGCAGATGTTGAATTCACTATGAGGTGGGAGGATGTAGGGCCA 

мы можем подтвердить, что это то, что написано в файл, если мы читаем файл, используя простой Python:

with open(corrected_file) as corrected: 
    print corrected.readlines()[0][1:] # prints 'bar foo' 

Это ошибка в BioPython? А если нет, что я сделал неправильно и как мне изменить идентификатор записи в файле FASTA с помощью BioPython?

+2

FASTA писатель печатает Seq.ID и seq.name, если они различны. Вам нужно будет изменить оба, если вы хотите напечатать только «бар». – heathobrien

+0

'record.description' содержит' foo' .... –

+2

Я нашел это «если вы измените только описание, то файл fasta содержит старую id, а затем новое описание. Если и старый идентификатор, и затем новое описание будут изменены одинаково, тогда вы получите тот эффект, который вы хотите ». in (https://www.biostars.org/p/95095/) –

ответ

2

Я не могу найти лучшее решение (кроме того, чтобы создать новый SeqRecord), на мой взгляд, это выглядит как ошибка

if record.id == 'foo': 
    record.id, record.name = ('bar',)*2 
    if record.description == 'foo': 
    record.description = 'bar'