AttributeError: 'str' object has no attribute 'id' using BioPython, parsing fasta

AttributeError: 'str' object has no attribute 'id' using BioPython, parsing fasta

我正在尝试使用 Bio 和 SeqIO 打开一个包含多个序列的 FASTA 文件,编辑序列的名称以删除所有名称末尾的“.seq”,(>SeqID20.seq 应该变为 >SeqID20),然后将所有序列写入新的 FASTA 文件,但我收到以下错误

AttributeError: 'str' object has no attribute 'id'

这就是我的开头:

with open ('lots_of_fasta_in_file.fasta') as f:
    for seq_record in SeqIO.parse(f, 'fasta'):
        name, sequence = seq_record.id, str(seq_record.seq)
        pair = [name.replace('.seq',''), sequence]
        SeqIO.write(pair, "new.fasta", "fasta")

但我也试过这个并得到同样的错误:

file_in ='lots_of_fasta_in_file.fasta'
file_out='new.fasta'

with open(file_out, 'w') as f_out:
    with open(file_in, 'r') as f_in:
        for seq_record in SeqIO.parse(f_in, 'fasta'):
            name, sequence = seq_record.id, str(seq_record.seq)
            # remove .seq from ID and add features
            pair = [name.replace('.seq',''), sequence]
            SeqIO.write(pair, file_out, 'fasta')

我假设我在从列表 'pair' 写入新文件时犯了一些错误,但我不确定要更改什么。如有任何帮助,我们将不胜感激!

不是真正适合您的代码的解决方案,但适合您的需要:

sed 's/\.seq$//' lots_of_fasta_in_file.fasta > new.fasta

此脚本假设有一个正确的 fasta 文件。它将删除任何行末尾的所有“.seq”字符串。在一个合适的 fasta 文件中,只有 ID 行应该包含这个字符。

您的错误发生是因为 SeqIO.write 接受 SeqRecordSeqRecord 的 list/iterator,但您只提供 [name, sequence] 这样的列表。相反,我建议您只修改 SeqRecord .id.description(请注意,如果 header 行中有空白,您也需要处理它)。此外,一次写入所有记录是最有效的(跨 Biopython 版本),而不是每次迭代调用 .write

from Bio import SeqIO

def yield_records():
    with open('lots_of_fasta_in_file.fasta') as f:
        for seq_record in SeqIO.parse(f, 'fasta'):
            seq_record.id = seq_record.description = seq_record.id.replace('.seq','')
            yield seq_record

SeqIO.write(yield_records(), 'new.fasta', 'fasta')