Непосредственный вызов SeqIO.parse () для цикла for работает, но использование его отдельно заранее не помогает?Зачем? - PullRequest
0 голосов
/ 21 февраля 2019

В 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 () в переменной(?) вызвал, а затем попытался использовать его в моем цикле, он не запускается:

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

for asq in a:
    print("Q")

Это потому, что выход из функции ||SeqIO.parse ("a.fasta", "fasta") ||хранится в «а» иначе, чем когда я его прямо называю?Что именно здесь означает «а».Это переменная?Это объект?Что на самом деле возвращает функция?

1 Ответ

0 голосов
/ 21 февраля 2019

SeqIO.parse() возвращает обычный генератор питона.Эта часть модуля Biopython написана на чистом Python:

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

Как только генератор перебирается, он исчерпывается, как вы обнаружили.Вы не можете перематывать генератор, но вы можете сохранить содержимое в list или dict, если вы не против поместить все это в память (полезно, если вам нужен произвольный доступ).Вы можете использовать SeqIO.to_dict(a) для сохранения в словаре с идентификаторами записей в качестве ключей и последовательностей в качестве значений.Просто повторная сборка генератора, вызывающего SeqIO.parse() снова, конечно же, не позволит выгрузить содержимое файла в память.

...