【Python】バイナリファイルへの追記(モードab)【入門第62回】

188, 2019-09-21

目次

バイナリファイルに追記する

こんにちは、narupoです。

今回も前回に引き続きPythonのファイル入出力についてです。
今回はバイナリファイルへの追記方法を解説します。

バイナリファイルへ追記するにはopen関数のmode引数に文字列abを指定してファイルを開きます。
open関数から得られるファイルオブジェクトのタイプは_io.BufferedWriterです。
ファイルオブジェクトのメソッドであるwriteなどを使うとデータをバイナリファイルに追記することが出来ます。

追記方法について、具体的には↓を見ていきます。

  • サンプルとするファイル

  • バイナリファイルを追記モードで開く

  • ファイルオブジェクトのタイプ

  • writeメソッドで追記する

  • tellメソッドでファイルのオフセット位置を確認する

ほかのファイル入出力についての入門記事は↓をご覧ください。

サンプルとするファイル

今回は解説のために↓のようなバイナリファイルalphas.datを使います。

abc

バイナリファイルを追記モードで開く

バイナリファイルを追記モードで開くには↓のようにopen関数を使います。

with open('alphas.dat', mode='ab') as fout:
    pass

open関数の第1引数にファイルのパスを指定します。

mode引数には文字列のabを指定します。
abappend binary, またはadd binaryの略です。

open関数はabモードを指定すると、ファイルが存在しない場合はファイルを新規作成してファイルを開きます。
ファイルが既に存在する場合はそのファイルを開き、ファイルのオフセット位置を末尾に移動します。

open関数の詳しい使い方については↓の記事をご覧ください。

ファイルオブジェクトのタイプ

abモードで開いたファイルオブジェクトのタイプは_io.BufferedWriterです。

with open('alphas.dat', mode='ab') as fout:
    print(type(fout))

↑のコードの実行結果は↓のようになります。

<class '_io.BufferedWriter'>

io.BufferedWriterio.BufferedIOBaseを継承し、さらにio.BufferedIOBaseio.IOBaseを継承しています。
これらのクラスの公式ドキュメントを参照すればファイルオブジェクトで利用できるメソッドが一望できます。

writeメソッドで追記する

ファイルオブジェクトのメソッドwriteを使うとバイナリファイルにデータを追記することが出来ます。

with open('alphas.dat', mode='ab') as fout:
    fout.write(b'def')

↑のコードを実行するとalphas.datの中身は↓のようになります。

abcdef

b'def'というのはPythonではバイト列を表しています。
バイト列については↓の記事をご覧ください。

tellメソッドでファイルのオフセット位置を確認する

ファイルオブジェクトは内部でオフセット位置を持っています。
ファイルオブジェクトはこのオフセット位置を基点にしてファイルを読み書きします。
このオフセット位置を取得する場合はファイルオブジェクトのメソッドtellを使います。
たとえば↓のようなファイル、

abc

alphas.datをバイナリファイルの追記モードで開いた場合のtellメソッドが返す値は、

with open('alphas.dat', mode='ab') as fout:
    print('オフセット位置は', fout.tell(), 'バイト目にあります')

↓のようになります。

オフセット位置は 3 バイト目にあります

バイナリファイルのtellメソッドはテキストファイルと違って意味のある値を返します。
tellメソッドの返す値はバイト数です。
↑の例ではabcというデータがファイルに書き込まれていますので、追記モードで開いた場合のオフセット位置は3バイト目になります。

これをたとえばb'def'を追記した後に確認してみると、

with open('alphas.dat', mode='ab') as fout:
    fout.write(b'def')
    print('オフセット位置は', fout.tell(), 'バイト目にあります')

↓のような結果になります。

オフセット位置は 6 バイト目にあります

writeメソッドでデータを追記したときにファイルオブジェクト内のオフセット位置も移動するので結果は6バイト目になります。

おわりに

バイナリファイルの追記はランダムアクセスの布石となります。
この追記モードでファイルオブジェクトがどのように動作しているかはランダムアクセスの解説で解説します。

オフセット位置を移動してるだけでしょ?

しっ

以上、次回に続きます。

また見てね

関連動画





スポンサーリンク

スポンサーリンク

スポンサーリンク

スポンサーリンク