【Python】バイナリファイルを読み書きモードで追記する(モードa+b)【入門第71回】
目次
- バイナリファイルを読み書きモードで追記
- バイナリファイルを読み書き&追記モードで開く
- io.BufferedRandomの詳細
- バイナリファイルにデータを追記する
- バイナリファイルからデータを読み込む
- おわりに
- 関連動画
バイナリファイルを読み書きモードで追記
バイナリファイルを読み書きモードで追記するには、まずopen
関数のmode
引数にa+b
を指定します。
このモードのopen
関数は開こうとするファイルが存在しない場合はファイルを新規作成してファイルを開きます。
開こうとするファイルが存在する場合はオフセット位置をファイル末尾に移動してファイルを開きます。
このモードのopen
関数から得られるファイルオブジェクトはio.BufferedRandom
です。
ファイルオブジェクトのread
やwrite
メソッドを使うとバイナリファイルにデータを読み書きすることが出来ます。
今回は具体的には↓を見ていきます。
バイナリファイルを読み書き&追記モードで開く
io.BufferedRandomの詳細
バイナリファイルにデータを追記する
バイナリファイルからデータを読み込む
ほかのファイル入出力についての入門記事は↓をご覧ください。
- 【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回】
バイナリファイルを読み書き&追記モードで開く
バイナリファイルを読み書き&追記モードで開くにはopen
関数を↓のようにして使います。
:::python
with open('alphas.dat', mode='a+b') as fp:
pass
open
関数の第1引数にファイルのパスを指定します。
mode
引数には文字列でa+b
を指定します。
このモードのopen
関数は開こうとするファイルが存在しない場合はファイルを新規作成してファイルを開きます。
開こうとするファイルが存在する場合はオフセット位置をファイル末尾に移動してファイルを開きます。
open
関数について詳しく知りたい方は↓の記事をご覧ください。
io.BufferedRandomの詳細
a+b
モードのopen
関数から得られるファイルオブジェクトはio.BufferedRandom
です。
:::python
with open('alphas.dat', mode='a+b') as fp:
print(type(fp))
↑のコードの実行結果は↓のようになります。
:::text
<class '_io.BufferedRandom'>
io.BufferedRandom
の公式ドキュメントは↓です。
io.BufferedRandom
はio.BufferedReader
およびio.BufferedWriter
を継承したクラスです。
- io --- ストリームを扱うコアツール — io.BufferedReader — Python 3.7.4 ドキュメント
- io --- ストリームを扱うコアツール — io.BufferedWriter — Python 3.7.4 ドキュメント
io.BufferedReader
およびio.BufferedWriter
はそれぞれio.BufferedIOBase
を、io.BufferedIOBase
はio.IOBase
を継承しています。
- io --- ストリームを扱うコアツール — io.BufferedIOBase — Python 3.7.4 ドキュメント
- io --- ストリームを扱うコアツール — io.IOBase — Python 3.7.4 ドキュメント
これらのクラスの公式ドキュメントを参照すれば利用できるメソッドを一望することが出来ます。
バイナリファイルにデータを追記する
たとえば↓のような内容のバイナリファイルalphas.dat
があります。
:::text
abc
このalphas.dat
を読み書きモードで開いて追記するには↓のようにwrite
メソッドを使います。
:::python
with open('alphas.dat', mode='a+b') as fp:
fp.write(b'def')
↑のコードを実行するとalphas.dat
の中身は↓のようになります。
:::text
abcdef
a+b
モードでファイルを開くと、開いた直後のファイルオブジェクト内のオフセット位置はファイル末尾になっています。
そのためwrite
メソッドを単純に使えばそのままファイルに追記することが出来ます。
write
メソッドで書き込めるデータはバイト列かバイト列の類に限られます。
バイト列について詳しく知りたい方は↓の記事をご覧ください。
- [TODO: リンク(バイト列)]
その他、データの書き込みについて詳しく知りたい方は↓の記事をご覧ください。
バイナリファイルからデータを読み込む
たとえば↓のような内容のバイナリファイルalphas.dat
があります。
:::text
abc
a+b
モードで開いたファイル、alphas.dat
からデータを読み込みたい場合は↓のようにread
を使いますが、
:::python
with open('alphas.dat', mode='a+b') as fp:
data = fp.read()
print(data)
↑のコードの実行結果は↓のようになります。
:::text
b''
空のデータが返ってきました。
a+b
モードでファイルを開くと、開いた直後のファイルオブジェクト内のオフセット位置はファイル末尾になっています。
これはtell
メソッドなどで確認することが出来ます。
さきほどのalphas.dat
を開いて確認してみましょう。
:::python
with open('alphas.dat', mode='a+b') as fp:
print(fp.tell())
↑のコードの実行結果は↓のようになります。
:::text
3
バイナリファイルの場合、tell
メソッドはファイル先頭から現在位置までのバイト数を返します。
↑の例ではファイルのオフセット位置は3
バイト目になっていますね。
これはabc
という内容のバイナリファイルを開いているので、このabc
分が3
バイトということです。
a+b
モードでデータを読み込みたい場合は↓のようにseek
メソッドでファイルのオフセット位置をファイル先頭にしてからデータを読み込みます。
:::python
import os
with open('alphas.dat', mode='a+b') as fp:
# ファイルのオフセット位置を先頭に移動する
fp.seek(0, os.SEEK_SET)
# ファイル先頭からデータを読み込む
data = fp.read()
print(data)
seek
メソッドの第1引数には第2引数からの基点位置を指定します。
第2引数にはシークの基点となる定数を渡します。
os.SEEK_SET
はファイル先頭を表す定数です。
つまりfp.seek(0, os.SEEK_SET)
というのはファイルのオフセット位置を「ファイル先頭から0
の位置」に移動する命令というわけです。
その他、データの読み込みについて詳しく知りたい方は↓の記事をご覧ください。
おわりに
a
系のモードはw
系と比べてファイルを破壊的に開かないので、なかなか安心できるモードと言えます。
うまいこと使い分けるようにしましょう。
以上、次回に続きます。
また見てね