直接在for循环中调用SeqIO.parse(),但是事先单独使用不是吗?为什么?

时间:2019-02-21 02:32:14

标签: python bioinformatics biopython fasta

在python中,我直接调用函数SeqIO.parse()的代码运行良好:

from Bio import SeqIO
a = SeqIO.parse("a.fasta", "fasta")
records = list(a)

for asq in SeqIO.parse("a.fasta", "fasta"):
    print("Q")

但是,在这里,我首先将SeqIO.parse()的输出存储在名为a的变量(?)中,然后尝试在我的循环中使用它,它不会运行:

from Bio import SeqIO
a = SeqIO.parse("a.fasta", "fasta")
records = list(a)

for asq in a:
    print("Q")

这是因为函数||的输出SeqIO.parse(“ a.fasta”,“ fasta”)||与直接调用时存储在“ a”中的方式不同吗? 这里的“ a”的确切身份是什么。它是变量吗?是物体吗?函数实际上返回什么?

1 个答案:

答案 0 :(得分:3)

SeqIO.parse()返回一个普通的python生成器。 Biopython模块的这一部分是用纯python编写的:

>>> from Bio import SeqIO
>>> a = SeqIO.parse("a.fasta", "fasta")
>>> type(a)
<class 'generator'>

一旦迭代生成器,就会如您发现的那样耗尽。您不能倒带生成器,但如果不介意将其全部存储在内存中,则可以将内容存储在listdict中(如果需要随机访问,则很有用)。您可以使用SeqIO.to_dict(a)来存储在字典中,其中记录ID为键,而序列为值。只需重新构建再次调用SeqIO.parse()的生成器,就可以避免将文件内容转储到内存中。