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
Создает дополнительный файл, а именно индексирует каждую запись фаста. Это действительно быстро.