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

Abr*_*mad 3 python bioinformatics fasta biopython

在 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")
Run Code Online (Sandbox Code Playgroud)

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

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

for asq in a:
    print("Q")
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*nds 5

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

>>> from Bio import SeqIO
>>> a = SeqIO.parse("a.fasta", "fasta")
>>> type(a)
<class 'generator'>
Run Code Online (Sandbox Code Playgroud)

正如您所发现的,一旦生成器被迭代,它就会耗尽。您无法倒带生成器,但您可以将内容存储在list或中dict,如果您不介意将其全部放入内存中(如果您需要随机访问,则很有用)。您可以使用SeqIO.to_dict(a)以记录 id 作为键、以序列作为值的方式存储在字典中。当然,只需重新构建生成器SeqIO.parse()再次调用即可避免将文件内容转储到内存中。