ほぼ中立ブログ

少しだけ趣味に偏った雑記ブログ

Biopythonで入力ファイルがFASTA形式か調べる

与えられた配列ファイルをプログラムで処理する際に、ファイルのフォーマットを調べておきたいという場合がたまにあります。拡張子で識別するのが簡単で手っ取り早いですが、FASTAファイルのようによく使われる拡張子が複数種類あるものだと、識別が若干面倒です。

そこで、拡張子によらずファイルがFASTA形式かどうかを判定する方法を調べることにしました。Stack OverflowのこちらのQ&Aに同じような内容がありましたので、こちらに記載されていたコードをほぼそのまま利用させていただきました。次の通りです。

from Bio import SeqIO

def is_fasta(seq_file):
    record = SeqIO.parse(seq_file, "fasta")
    return any(record)

BiopythonのSeqIO.parseを利用すると簡単に複数種類のファイルを読み込むことができますが、その際に指定したファイルの種類と実際のファイルの種類が異なっていると、戻り値のジェネレータの中身が空になります。これを利用することにより、与えられたファイルがFASTA形式なのかを判定することができる、ということのようです。

せっかくなので、与えられたディレクトリの中のファイルがFASTA形式なのか、GenBank形式なのか調べるプログラムを作ってみました。なお、複数種類のファイルが混在している場合は例外を発生させることにしました。

#!/usr/bin/env python3

from glob import glob
import os
import sys
from Bio import SeqIO

def identify_filetype(seq):
    formats = ["fasta", "genbank"]
    for file_format in formats:
        record = SeqIO.parse(seq, file_format)
        if any(record):
            return file_format

def identify_dirtype(seq_dir):
    path = os.path.join(seq_dir, "*.*")
    files = glob(path)
    memory = set()
    for seq in files:
        file_format = identify_filetype(seq)
        memory.add(file_format)
    if len(memory) != 1:
        raise Exception
    file_format = memory.pop()
    print(file_format)

if __name__ == '__main__':
    indir = sys.argv[1]
    identify_dirtype(indir)

最後までお読みいただきありがとうございました。