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

时间:2015-09-01 15:32:44

标签: bioinformatics 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?

1 个答案:

答案 0 :(得分:2)

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

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