【Python】バイナリファイルを排他的に開いて書き込む(モードxb)【入門第63回】

190, 2019-09-22

目次

バイナリファイルを排他的に処理する

こんにちは、narupoです。

今回も前回に引き続き、Pythonのファイル入出力についてです。
今回はバイナリファイルを排他的に開いて書き込む方法を解説します。

バイナリファイルを排他的に開くにはopen関数のmode引数に文字列xbを指定します。
モードxbを指定した場合、open関数から得られるファイルオブジェクトのタイプは_io.BufferedWriterです。
ファイルオブジェクトのwriteメソッドを使うとバイナリファイルにデータを書き込むことが出来ます。

今回は具体的には↓を見ていきます。

  • バイナリファイルを排他的に開く

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

  • ファイルオブジェクトが読み書き可能かチェックする

  • writeメソッドでデータを書き込む

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

バイナリファイルを排他的に開く

バイナリファイルを排他的に開くにはopen関数を↓のようにして使います。

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

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

mode引数には文字列xbを指定します。
xbeXclusive Binaryの略です。
Exclusiveは「排他的」という意味です。

open関数にモードxbを指定して開こうとするファイルが既に存在する場合、open関数は例外FileExistsErrorを送出します。

:::python
try:
    with open('alphas.dat', mode='xb') as fout:
        pass
except FileExistsError:
    print('すでにファイルが存在します')

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

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

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

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

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

:::text
<class '_io.BufferedWriter'>

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

ファイルオブジェクトが読み書き可能かチェックする

xbモードで開いたファイルオブジェクトが読み込み可能かどうか確かめるにはreadableメソッドを使います。
これはファイルオブジェクトが読み込み可能な時にTrueを返し、読み込み不可能な時にFalseを返します。

:::python
with open('alphas.dat', mode='xb') as fout:
    print(fout.readable())

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

:::text
False

writableメソッドはファイルオブジェクトが書き込み可能な時にTrue, 書き込み不可能な時にFalseを返します。

:::python
with open('alphas.dat', mode='xb') as fout:
    print(fout.writable())

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

:::text
True

以上のことから、モードxbで開いたファイルは書き込み専用であることがわかります。

writeメソッドでデータを書き込む

ファイルオブジェクトのwriteメソッドを使うとデータを書き込むことが出来ます。

:::python
with open('alphas.dat', mode='xb') as fout:
    fout.write(b'abc')

おわりに

バイナリファイルを排他的に開けるようになると、既存のファイルを上書きするなどのミスやバグを防止することが出来ます。
大切なデータが入っているファイルをwbモードで開いて空にしてしまった……。そんなミスはモードxbで防ぎましょう。

以上、次回に続きます。

また見てね

関連動画