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

标签 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'到底是什么身份。它是一个变量吗?它是一个对象吗?该函数实际返回什么?

最佳答案

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() 即可避免将文件内容转储到内存中。

关于python - 在 for 循环中直接调用 SeqIO.parse() 可以,但是事先单独使用它不行吗?为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54798332/

相关文章:

alignment - Biopython:DNA 序列之间的局部比对未找到最佳比对

python - 有没有一个覆盖所有ht​​ml实体的python模块?

python - 如何使用 Biopython 中的 SeqIO 打印前几条记录

r - 错误: compilation failed for package ‘seqminer’

python - 如何搜索项目集合是否在列表中?

python - Biopython 比对的无间隙索引

python - 在装饰器中自动分配初始化参数

python - 在 R 中混合使用文本和分类列进行文本分析

php - 可用于编程的最有值(value)的认证是什么?

parsing - Bio.Phylo.PAML.codeml 的结果解析器安静地无法读取所有数据