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

问题描述 投票:3回答:1

在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'的身份究竟是什么?它是变量吗?它是一个对象吗?功能实际上返回了什么?

python bioinformatics biopython fasta
1个回答
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()将避免将文件内容转储到内存中。

© www.soinside.com 2019 - 2024. All rights reserved.