AttributeError:“str”对象没有使用BioPython分析fas的属性“id”

2024-09-28 23:29:33 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

这是我开始的:

^{pr2}$

但我也试过了,得到了同样的错误:

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”到写入新文件时犯了一些错误,但我不确定要更改什么。任何帮助都将不胜感激!在


Tags: 文件ingt名称错误序列outrecord
0条回答
网友
1楼 · 发布于 2024-09-28 23:29:33

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

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

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

网友
2楼 · 发布于 2024-09-28 23:29:33

发生错误的原因是SeqIO.write接受SeqRecord或{}的列表/迭代器,但您只是给它提供一个类似[name, sequence]的列表。相反,我建议您只修改SeqRecord.id和{}(注意,如果标题行中有空白,您也需要处理这个问题)。另外,最有效的方法是(跨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')

相关问题 更多 >