ファイル

ファイルを取り扱うとき、ファイルの名前と文字コードを同時に指定することが推奨される。ファイルを開くとき、open をそのまま利用しても良いが、より安全な方法として with 文とともに用いる。with 文を用いることで、プログラムがファイルの読み込み中に異常終了しても、ファイルが自動的に正しく閉じられる。

ファイルの読み込み

次は、PDB ファイル(1ALK.pdb)を読み込み、3 文字のアミノ酸コードを抽出する例である。アミノ酸コードは SEQRES 行にかかれているため、if 文を利用して SEQRES 行を探して、データを取得する。

aa = ''

with open('1ALK.pdb', mode = 'r', encoding = 'utf-8') as fh:
  for buff in fh:
    if buff[0:6] == 'SEQRES':
      buff = buff.rstrip()
      aa += buff[19:]

aa = aa.replace(' ', '')
print(aa)

ファイルの書き出し

ファイルを作成する場合は、ファイルを書き込みモード w あるいは追加書き込みモード a で開く。書き込みモードで開くとき、ファイルが既に存在している場合はその内容が破棄される。追加書き込みモードでは、既存のファイルの下側に、内容を追加する。

名前が new.fa となるファイルを新規作成する場合は次のようにする。

with open('new.fa', mode = 'w', encoding = 'utf-8') as fh:
  fh.write('>NEW SEQ A\n')
  fh.write('ACGATTTTATGCTGATCGTAGCTGTAGTCTAGCTGTCTGTC\n')

名前が sample.txt となるファイルに新しいデータを書き込み上書き保存する場合は次のようにする。ただし、sample.txt が存在しない場合は、新規作成される。

with open('new.fa', mode = 'a', encoding = 'utf-8') as fh:
  fh.write('>NEW SEQ B\n')
  fh.write('GATCGTAGCTGTAGTCTAGCTGTCTGTGGCATTATTTTGTA\n')

GZIP ファイルの読み書き

gzip モジュールを使うことで、GZIP 形式の圧縮ファイルをそのまま Python で読み書きできる。操作方法は、標準ファイルの読み書きとほぼ同じように行える。

gzip ファイルの読み込み

gzip ファイルの読み込みは gzip モジュールを使う。GZIP 形式のファイルはバイナリーファイルであるので、ファイルの読み込むときに、バイナリー読み込みモード rb を使う。ただし、ここで読み込んだテキストはバイナリーのままとなっているので、普通の文字列として使用するには、バイナリーから文字列に変換する処理が必要である。

import gzip

with gzip.open('sample.fa.gz', 'rb') as fh:
    for buff in fh.readlines():
        print(buff)

また、読み込みモードに rt がある。このモードで GZIP 形式のファイルを読み込むと、読み込んだテキストは自動的に文字列に変換してくれる。テキストを読み込むのであれば、このモードを使うと便利である。

import gzip

with gzip.open('sample.fa.gz', 'rt') as fh:
    for buff in fh.readlines():
        print(buff)

gzip ファイルの書き出し

gzip モジュールを使うことで、直接 GZIP 形式のファイルに書き込むことができる。書き込みの際に、バイナリー書き込みモード wb を使用する。この際、文字列をバイナリーデータに変換してから write に渡す必要がある。

import gzip

with gzip.open('sample.fa.gz', 'wb') as fh:
    fh.write(b'>Seq1\nGCTGATCGAGTCGATCGATGCAGCTAGGT\n')
    fh.write(b'>Seq2\nTCGATTATATGCTAGTCGATGCTTTCGATGCGCT\n')
    fh.write(b'>Seq3\nGCTGAATCGCTATTATATGCATGCATGTCTGCAGCTAGGCT\n')

また、書き込みモードに wt がある。このモードを使用すると、文字列をそのまま write 関数に与えると、関数内で自動的にバイナリーデータに変換し、GZIP ファイルに書き込まれる。テキストの書き込みであれば、このモードを使うと便利である。

import gzip

with gzip.open('sample.fa.gz', 'wt') as fh:
    fh.write('>Seq1\nGCTGATCGAGTCGATCGATGCAGCTAGGT\n')
    fh.write('>Seq2\nTCGATTATATGCTAGTCGATGCTTTCGATGCGCT\n')
    fh.write('>Seq3\nGCTGAATCGCTATTATATGCATGCATGTCTGCAGCTAGGCT\n')