SeqIO.parse在fasta.gz上

Mel*_*l88 10 python gzip bioinformatics biopython

编码新手.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
Run Code Online (Sandbox Code Playgroud)

kli*_*lim 19

你在用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)
Run Code Online (Sandbox Code Playgroud)


Chr*_*nds 5

如果您想同时处理常规文本和 gzip 文件,这是一个解决方案:

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
_open = partial(gzip.open, mode='rt') if encoding == 'gzip' else open

with _open(input_file) as f:
    for record in SeqIO.parse(f, 'fasta'):
        print(record)
Run Code Online (Sandbox Code Playgroud)

注意:这依赖于具有正确文件扩展名的文件,我认为这几乎在所有时间都是合理的(如果不满足这个假设,错误是显而易见的)。但是,请阅读此处了解实际检查文件内容的方法,而不是依赖此假设。