SeqIO.parse на fasta.gz

Новое в кодировании. Новое в Pytho/biopython; это мой первый вопрос в сети. Как открыть сжатый файл fasta.gz для извлечения информации и выполнения вычислений в моей функции. Вот упрощенный пример того, что я пытаюсь сделать (я пробовал разные способы), и в чем ошибка. Команда gzip, которую я использую, похоже, не работает.

with gzip.open("practicezip.fasta.gz", "r") as handle:
    for record in SeqIO.parse(handle, "fasta"):
        print(record.id)

Traceback (most recent call last):

  File "<ipython-input-192-a94ad3309a16>", line 2, in <module>
    for record in SeqIO.parse(handle, "fasta"):

  File "C:\Users\Anaconda3\lib\site-packages\Bio\SeqIO\__init__.py", line 600, in parse
    for r in i:

  File "C:\Users\Anaconda3\lib\site-packages\Bio\SeqIO\FastaIO.py", line 122, in FastaIterator
    for title, sequence in SimpleFastaParser(handle):

  File "C:\Users\Anaconda3\lib\site-packages\Bio\SeqIO\FastaIO.py", line 46, in SimpleFastaParser
    if line[0] == ">":

IndexError: index out of range

3 ответа

Решение

Вы используете python3?

Это ("r" -> "rt") может решить вашу проблему.

import gzip
from Bio import SeqIO

with gzip.open("practicezip.fasta.gz", "rt") as handle:
    for record in SeqIO.parse(handle, "fasta"):
        print(record.id)

Вот решение, если вы хотите обрабатывать как обычные текстовые, так и сжатые файлы:

import gzip
from mimetypes import guess_type
from functools import partial

from Bio import SeqIO

input_file = 'input_file.fa.gz'

encoding = guess_type(input_file)[1]  # uses file extension
if encoding is None:
    _open = open
elif encoding == 'gzip':
    _open = partial(gzip.open, mode='rt')
else:
    raise ValueError('Unknown file encoding: "{}"'.format(encoding))

with _open(input_file) as f:
    for record in SeqIO.parse(f, 'fasta'):
        print(record)

ПРИМЕЧАНИЕ: это основано на том, что файл имеет правильное расширение файла, что я считаю разумным почти все время (и ошибки очевидны и явны, если это предположение не выполняется). Тем не менее, читайте здесь, чтобы узнать, как на самом деле проверить содержимое файла, а не полагаться на это предположение.

@klim ответ хорош. Однако в некоторых случаях вы не хотите повторять итерацию, а просто выберите одну запись. В таких случаях используйте следующий код:

      import pyfastx
fa = pyfastx.Fasta('ATEST.fasta.gz')
s1 = fa['KF530110.1']
fa_sequence = s1.seq

Создает дополнительный файл, а именно индексирует каждую запись фаста. Это действительно быстро.

Другие вопросы по тегам