ほぼ中立ブログ

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

BiopythonでFASTA形式をPhylip形式に変換する

解析に使うプログラムの中には、FASTA形式の配列ファイルではなくPhylip形式のものを要求するものがあります。今回はそのような事情でFASTA形式のデータをPhylip形式に変換する、ちょっとしたスクリプトを書いたので備忘録を兼ねてまとめます。

Phylip形式についてのメモ

参考サイト

Phylip形式については上の参考サイト様にまとめられていたのですが、変換の際に重要そうなのは

  • 配列名は本来の定義では10文字しか使えないが、配列名と配列との間にスペースを入れることで配列名長の制限を廃止または緩めた形式も使われている。
  • interleaved形式とsequential形式がある。

この2点です。

変換方法

BiopythonのモジュールのAlignIOを使用します。公式のチュートリアルの抜粋・翻訳ですが下にまとめていきます。 AlignIOはSeqIOと概ね似たモジュールで対応しているフォーマットも同じです。 Phylip形式のファイルに対しては次の3通りに対応しているようです。

  • phylip
  • phylip-sequential
  • phylip-relaxed

phylipがinterleavedのPhylip形式ファイル、phylip-sequentialがsequentialなPhylip形式ファイルに対応しています。この2つに関しては配列名の長さが10文字以内という制約があります。3つめのPhylip-relaxedは配列名の長さに制限が無い、interleavedなPhylip形式です。

変換の具体的な方法ですが、BiopythonでFASTA形式として読み込んだ配列データをPhylip形式で書き出すだけです。公式のチュートリアルに"File Format Conversion"としてコードの例が紹介されていました。ただ、配列長が揃っていないとエラーが出ますのでアライメントは事前に行っておく必要があります。チュートリアルのコードを少し変えただけですが今回作成したスクリプトは以下の通りです。

とりあえず配列名の長さに制限の無いphylip-relaxedで出力されますので、適宜コードを変更する必要があります。

#!/usr/bin/python3

import sys
import os
from Bio import AlignIO

def convert(fasta):
    fasta = sys.argv[1]
    name = os.path.basename(fasta)
    name = os.path.splitext(name)[0]
    outfile = "{0}.phy".format(name)
    with open(fasta, "r", encoding="UTF-8") as f, open(outfile, "w", encoding="UTF-8") as out:
        alignments = AlignIO.parse(f, "fasta")
        AlignIO.write(alignments, out, "phylip-relaxed")


if __name__ == '__main__':
    infile = sys.argv[1]
    convert(infile)

適当なFASTAファイルを与えると

>Taxon1
AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDDEEEEEEEEEEFFFFFFFFFF
>Taxon2
AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDDEEEEEEEEEEFFFFFFFFFF
>Taxon3
AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDDEEEEEEEEEEFFFFFFFFFF
>Taxon4
AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDDDDDEEEEEEEEEEFFFFFFFFFF

Phylip形式になります。

 4 60
Taxon1  AAAAAAAAAA BBBBBBBBBB CCCCCCCCCC DDDDDDDDDD EEEEEEEEEE
Taxon2  AAAAAAAAAA BBBBBBBBBB CCCCCCCCCC DDDDDDDDDD EEEEEEEEEE
Taxon3  AAAAAAAAAA BBBBBBBBBB CCCCCCCCCC DDDDDDDDDD EEEEEEEEEE
Taxon4  AAAAAAAAAA BBBBBBBBBB CCCCCCCCCC DDDDDDDDDD EEEEEEEEEE

        FFFFFFFFFF 
        FFFFFFFFFF 
        FFFFFFFFFF 
        FFFFFFFFFF