【Python】バイナリファイルへの追記(モードab)【入門第62回】
目次
- バイナリファイルに追記する
- サンプルとするファイル
- バイナリファイルを追記モードで開く
- ファイルオブジェクトのタイプ
- writeメソッドで追記する
- tellメソッドでファイルのオフセット位置を確認する
- おわりに
- 関連動画
バイナリファイルに追記する
こんにちは、narupoです。
今回も前回に引き続きPythonのファイル入出力についてです。
今回はバイナリファイルへの追記方法を解説します。
バイナリファイルへ追記するにはopen
関数のmode
引数に文字列ab
を指定してファイルを開きます。
open
関数から得られるファイルオブジェクトのタイプは_io.BufferedWriter
です。
ファイルオブジェクトのメソッドであるwrite
などを使うとデータをバイナリファイルに追記することが出来ます。
追記方法について、具体的には↓を見ていきます。
サンプルとするファイル
バイナリファイルを追記モードで開く
ファイルオブジェクトのタイプ
writeメソッドで追記する
tellメソッドでファイルのオフセット位置を確認する
ほかのファイル入出力についての入門記事は↓をご覧ください。
- 【Python】ファイルを開いて閉じる。open関数の使い方【入門第54回】
- 【Python】テキストファイルの読み込み(モードr, rt)【入門第55回】
- 【Python】テキストファイルへの書き込み(モードw, wt)【入門第56回】
- 【Python】テキストファイルへの追記(モードa, at)【入門第57回】
- 【Python】テキストファイルを排他的に開いて書き込む(モードx, xt)【入門第58回】
- 【Python】バイナリファイルの読み込み(モードrb)【入門第59回】
- 【Python】バイナリファイルへの書き込み(モードwb)【入門第60回】
- 【Python】バイナリファイルへの追記(モードab)【入門第61回】
- 【Python】バイナリファイルを排他的に開いて書き込む(モードxb)【入門第62回】
- 【Python】テキストファイルを読み書きモードで開く(モードr+, r+t)【入門第63回】
- 【Python】テキストファイルを読み書きモードで新規作成して開く(モードw+, w+t)【入門第64回】
- 【Python】テキストファイルを読み書きモードで、新規作成して、排他的に開く(モードx+, x+t)【入門第65回】
- 【Python】バイナリファイルを読み書きモードで開く(モードr+b)【入門第66回】
- 【Python】バイナリファイルを読み書きモードで新規作成して開く(モードw+b)【入門第67回】
- 【Python】バイナリファイルを読み書きモードで排他的に開く(モードx+b)【入門第68回】
- 【Python】テキストファイルを読み書きモードで追記する(モードa+)【入門第69回】
- 【Python】バイナリファイルを読み書きモードで追記する(モードa+b)【入門第70回】
- 【Python】バイナリファイルのランダムアクセスの基本・前編【入門第71回】
- 【Python】バイナリファイルのランダムアクセスの基本・後編【入門第72回】
- 【Python】ランダムアクセスによる固定長レコードの読み書き・前編【入門第73回】
サンプルとするファイル
今回は解説のために↓のようなバイナリファイルalphas.dat
を使います。
:::text
abc
バイナリファイルを追記モードで開く
バイナリファイルを追記モードで開くには↓のようにopen
関数を使います。
:::python
with open('alphas.dat', mode='ab') as fout:
pass
open
関数の第1引数にファイルのパスを指定します。
mode
引数には文字列のab
を指定します。
ab
はappend binary
, またはadd binary
の略です。
open
関数はab
モードを指定すると、ファイルが存在しない場合はファイルを新規作成してファイルを開きます。
ファイルが既に存在する場合はそのファイルを開き、ファイルのオフセット位置を末尾に移動します。
open
関数の詳しい使い方については↓の記事をご覧ください。
ファイルオブジェクトのタイプ
ab
モードで開いたファイルオブジェクトのタイプは_io.BufferedWriter
です。
:::python
with open('alphas.dat', mode='ab') as fout:
print(type(fout))
↑のコードの実行結果は↓のようになります。
:::text
<class '_io.BufferedWriter'>
io.BufferedWriter
はio.BufferedIOBase
を継承し、さらにio.BufferedIOBase
はio.IOBase
を継承しています。
これらのクラスの公式ドキュメントを参照すればファイルオブジェクトで利用できるメソッドが一望できます。
- io --- ストリームを扱うコアツール — io.BufferedIOBase — Python 3.7.4 ドキュメント
- io --- ストリームを扱うコアツール — io.IOBase — Python 3.7.4 ドキュメント
writeメソッドで追記する
ファイルオブジェクトのメソッドwrite
を使うとバイナリファイルにデータを追記することが出来ます。
:::python
with open('alphas.dat', mode='ab') as fout:
fout.write(b'def')
↑のコードを実行するとalphas.dat
の中身は↓のようになります。
:::text
abcdef
b'def'
というのはPythonではバイト列を表しています。
バイト列については↓の記事をご覧ください。
tellメソッドでファイルのオフセット位置を確認する
ファイルオブジェクトは内部でオフセット位置を持っています。
ファイルオブジェクトはこのオフセット位置を基点にしてファイルを読み書きします。
このオフセット位置を取得する場合はファイルオブジェクトのメソッドtell
を使います。
たとえば↓のようなファイル、
abc
alphas.dat
をバイナリファイルの追記モードで開いた場合のtell
メソッドが返す値は、
:::python
with open('alphas.dat', mode='ab') as fout:
print('オフセット位置は', fout.tell(), 'バイト目にあります')
↓のようになります。
:::text
オフセット位置は 3 バイト目にあります
バイナリファイルのtell
メソッドはテキストファイルと違って意味のある値を返します。
tell
メソッドの返す値はバイト数です。
↑の例ではabc
というデータがファイルに書き込まれていますので、追記モードで開いた場合のオフセット位置は3バイト目になります。
これをたとえばb'def'
を追記した後に確認してみると、
:::python
with open('alphas.dat', mode='ab') as fout:
fout.write(b'def')
print('オフセット位置は', fout.tell(), 'バイト目にあります')
↓のような結果になります。
:::text
オフセット位置は 6 バイト目にあります
write
メソッドでデータを追記したときにファイルオブジェクト内のオフセット位置も移動するので結果は6
バイト目になります。
おわりに
バイナリファイルの追記はランダムアクセスの布石となります。
この追記モードでファイルオブジェクトがどのように動作しているかはランダムアクセスの解説で解説します。
オフセット位置を移動してるだけでしょ?
しっ
以上、次回に続きます。
また見てね