home about terms twitter

Pythonを用いたFASTA配列中の最初の塩基の削除

date: 2020-02-10 | mod: 2020-02-10

FASTA配列中の文字列(塩基またはアミノ酸)について、最初の文字を削除するコードについて記載します。
このページに記載する方法では、Pythonにおけるバイオインフォマティクスに関するライブラリ「Biopython」は用いていません。

index


コード全体

動作環境:

  • python 3.6.8
input output
input.fasta output.fasta
f1 = open('output.fasta','w')
f2 = open('input.fasta', 'r')

lines = f2.readlines()
newseq = False
for line in lines:
    if line.find('>') == 0:
        f1.write(line)
        newseq = True
    elif line.find('>') != 0 and newseq == True:
        f1.write(line[1:])
        newseq = False
    elif line.find('>') != 0 and newseq == False:
        f1.write(line[0:])

f1.close
f2.close

入力ファイルの構成

今回使用するFASTAファイルの構成は以下の通りです。

input.fasta

>test_1
ATGTTCGACTAGCTACGTTA
GTAGTTCAGTCGTTCGATGC
>test_2
ATGTTCGACTAGCTACGTTA
GTAGTTCAGTCGTTCGATGC
>test_3
ATGTTCGACTAGCTACGTTA
GTAGTTCAGTCGTTCGATGC

FASTAフォーマットでは、">“から始まるヘッダ行にレコードの詳細が記載されています。
今回の場合は、シンプルに配列名(test_1, test_2, test_3)のみを載せています。


最初の塩基の削除

最初の塩基を削除するための箇所について記述します。

lines = f2.readlines()
newseq = False
for line in lines:
    if line.find('>') == 0:
        f1.write(line)
        newseq = True
    elif line.find('>') != 0 and newseq == True:
        f1.write(line[1:])
        newseq = False
    elif line.find('>') != 0 and newseq == False:
        f1.write(line[0:])

変数linesには、readlines()を用いてf2(= input.fasta)中の各行をリストとして取得しています。
このリストに格納されている各行(line)について、ループ処理を行っています。

ループ中では、最初にヘッダ行であることを判断します。

if line.find('>') == 0:

では、line(文字列)中の最初の位置(pythonでは0が最初にあたる)に”>“があるか判別します。
もし”>“が存在していた、すなわちヘッダ行である場合には、if以下の処理に移ります。

f1.write(line)

率直にlineの内容をファイルに書き込みます。一番初めには、「>test_1」が書き込まれます。

newseq = True

ヘッダ部分(>test_1)を得たということから、newseq = Trueとしています。

elif line.find('>') != 0 and newseq == True:
    f1.write(line[1:])
    newseq = False
elif line.find('>') != 0 and newseq == False:
    f1.write(line[0:])

最初のelifでは、ヘッダ行のすぐ下の行、すなわち配列のもっとも頭の部分である場合に、elif以下の処理を行うようにしています。
elif以下では、

line[1:]

を書き込ませることで、最初の文字を除いた、それ以降の文字をファイルに書き込みをしています。
そして、newseq = Falseとすることで、">“が新たに現れない限り、以降の行は一文字目を削除せずにそのまま書き込むように処理します。

二つ目のelifではその処理を行います。


出力

以上の処理を行うことで得られる出力は以下の通りです。
input.fastaと並べて表示します。

input.fasta

>test_1
ATGTTCGACTAGCTACGTTA
GTAGTTCAGTCGTTCGATGC
>test_2
ATGTTCGACTAGCTACGTTA
GTAGTTCAGTCGTTCGATGC
>test_3
ATGTTCGACTAGCTACGTTA
GTAGTTCAGTCGTTCGATGC

output.fasta

>test_1
TGTTCGACTAGCTACGTTA
GTAGTTCAGTCGTTCGATGC
>test_2
TGTTCGACTAGCTACGTTA
GTAGTTCAGTCGTTCGATGC
>test_3
TGTTCGACTAGCTACGTTA
GTAGTTCAGTCGTTCGATGC

いずれの場合においても、最初のAが削除されていることが確認されました。