使用 BioPython 更改 FASTA 文件中的记录 ID

Changing the record id in a FASTA file using BioPython

我有以下 FASTA 文件,original.fasta

>foo
GCTCACACATAGTTGATGCAGATGTTGAATTCACTATGAGGTGGGAGGATGTAGGGCCA

我需要把记录id从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')

我们打印了更改前后的记录id,得到了预期的结果。我们甚至可以通过使用 BioPython 再次读取更正后的文件并打印出记录 id:

来进行双重检查
with open(corrected_file) as corrected:
    for record in SeqIO.parse(corrected, 'fasta'):
        print record.id                  # prints 'bar', as expected

但是,如果我们在文本编辑器中打开更正后的文件,我们会看到记录 ID 不是 bar,而是 bar foo:

>bar foo
GCTCACACATAGTTGATGCAGATGTTGAATTCACTATGAGGTGGGAGGATGTAGGGCCA

如果我们使用普通 Python:

读取文件,我们可以确认这就是写入文件的内容
with open(corrected_file) as corrected:
    print corrected.readlines()[0][1:] # prints 'bar foo'

这是 BioPython 中的错误吗?如果不是,我做错了什么以及如何使用 BioPython?

更改 FASTA 文件中的记录 ID

我找不到更好的解决方案(除了创建一个新的 SeqRecord),在我看来它看起来像一个错误

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