web-dev-qa-db-ja.com

fasta.gzでのSeqIO.parse

コーディングは初めてです。 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
10
MelBel88

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)
20
klim

通常のテキストと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)

注:これは、正しいファイル拡張子を持つファイルに依存します。これは、ほぼ常に妥当であると思います(この仮定が満たされない場合、エラーは明白で明白です)。ただし、この仮定に依存するのではなく、ファイルの内容を実際にチェックする方法については、 ここを読んでください

4
Chris_Rands