Python fasta.gz上的SeqIO.parse

Python fasta.gz上的SeqIO.parse,python,bioinformatics,biopython,gzip,Python,Bioinformatics,Biopython,Gzip,新的编码。Pytho/biopython的新成员;这是我第一个在线问题。 如何打开一个压缩的fasta.gz文件以提取信息并在函数中执行计算。下面是一个简单的例子,说明我正在尝试做什么(我尝试了不同的方法),以及错误是什么。我使用的gzip命令似乎不起作用 with gzip.open("practicezip.fasta.gz", "r") as handle: for record in SeqIO.parse(handle, "fasta"): print(reco

新的编码。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
以gzip.open(“practicezip.fasta.gz”、“r”)作为句柄的
:
对于SeqIO.parse(句柄,“fasta”)中的记录:
打印(record.id)
回溯(最近一次呼叫最后一次):
文件“”,第2行,在
对于SeqIO.parse(句柄,“fasta”)中的记录:
文件“C:\Users\Anaconda3\lib\site packages\Bio\SeqIO\\uuuu init\uuuu.py”,第600行,在parse中
对于i中的r:
文件“C:\Users\Anaconda3\lib\site packages\Bio\SeqIO\FastaIO.py”,第122行,在FastaIterator中
对于标题,SimpleFastaParser(句柄)中的序列:
SimpleFastaParser中的文件“C:\Users\Anaconda3\lib\site packages\Bio\SeqIO\FastaIO.py”,第46行
如果第[0]行==“>”:
索引器:索引超出范围
您正在使用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)

如果要同时处理常规文本和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)
注意:这取决于文件是否具有正确的文件扩展名,我认为这几乎在所有情况下都是合理的(如果不满足此假设,则错误是显而易见的)。但是,我们需要找到一些方法来实际检查文件内容,而不是依赖于这个假设。

@klim的答案很好。 但是,在某些情况下,您不想迭代,只需选择一个条目。在这种情况下,请使用以下代码:

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

它创建一个附加文件,即为每个fasta条目编制索引。它真的很快。

当我不小心用错误的格式解析了一个fastq文件时,我遇到了与此类似的错误。如果您解压缩fasta文件并使用文本编辑器对其进行简要检查,您不会看到任何异常情况?