Biopython SeqIO调用报错:'str' object has no attribute 'id'求解
Biopython SeqIO写入报错排查方案
错误原因
- 核心触发点:
SeqIO.write()的第一个入参要求必须是SeqRecord对象或者SeqRecord对象的可迭代集合(列表、生成器等),你代码中将desired_proteins赋值为s_record.seq(仅序列内容,可能被隐式转为字符串),缺失了包含id属性的SeqRecord结构,最终触发'str' object has no attribute 'id'报错 - 附加逻辑问题:每次匹配到符合条件的序列就直接调用
SeqIO.write(),会反复覆盖输出文件,最终只会保留最后一条匹配结果
修复代码
from Bio import SeqIO # 初始化列表存储符合条件的SeqRecord对象 desired_proteins = [] # 用with上下文管理文件,不需要手动调用close with open('lineageV_paralog_warning_genes.fasta', 'r') as fh: for s_record in SeqIO.parse(fh, 'fasta'): name = s_record.id for i in paralogs_in_all: if name.endswith(i): # 直接存入完整的SeqRecord对象,不要单独提取seq desired_proteins.append(s_record) # 匹配到对应规则后跳出内层循环,避免重复添加同一条序列 break # 所有符合条件的序列收集完成后统一写入文件 SeqIO.write(desired_proteins, "filtered.fasta", "fasta")
补充说明
如果你打印得到的name自带>前缀,说明你的输入fasta文件的序列头格式存在异常(正常fasta的>是分隔符,不会被计入SeqRecord的id属性),可以检查原文件的序列头行是否存在重复>的问题,避免匹配规则失效。
内容的提问来源于stack exchange,提问作者mdgn15
相关产品推荐
相关产品推荐

