与えられた配列ファイルをプログラムで処理する際に、ファイルのフォーマットを調べておきたいという場合がたまにあります。拡張子で識別するのが簡単で手っ取り早いですが、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)
最後までお読みいただきありがとうございました。