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
接受 SeqRecord
或 SeqRecord
的 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')
我正在尝试使用 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
接受 SeqRecord
或 SeqRecord
的 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')