SeqIO.parse 在 fasta.gz
SeqIO.parse on a 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
您在使用 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)
注意:这依赖于具有正确文件扩展名的文件,我认为这几乎在所有时间都是合理的(如果不满足此假设,错误将是明显和明确的)。但是,read here 了解实际检查文件内容的方法,而不是依赖于此假设。
@klim 的回答很好。
但是,在某些情况下,您不想迭代而只是 select 单个条目。在这种情况下,请使用以下代码:
import pyfastx
fa = pyfastx.Fasta('ATEST.fasta.gz')
s1 = fa['KF530110.1']
fa_sequence = s1.seq
它创建一个额外的文件,即它索引每个fasta 条目。真快。
编码新手。 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
您在使用 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)
注意:这依赖于具有正确文件扩展名的文件,我认为这几乎在所有时间都是合理的(如果不满足此假设,错误将是明显和明确的)。但是,read here 了解实际检查文件内容的方法,而不是依赖于此假设。
@klim 的回答很好。 但是,在某些情况下,您不想迭代而只是 select 单个条目。在这种情况下,请使用以下代码:
import pyfastx
fa = pyfastx.Fasta('ATEST.fasta.gz')
s1 = fa['KF530110.1']
fa_sequence = s1.seq
它创建一个额外的文件,即它索引每个fasta 条目。真快。