【Python】バイナリファイルへの書き込み(モードwb)【入門第61回】

186, 2019-09-20

目次

バイナリファイルにデータを書き込む

こんにちは、narupoです。

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

バイナリファイルにデータを書き込むにはopen関数のmode引数にwbを指定してファイルを開きます。
開いたファイルオブジェクトのタイプは_io.BufferedWriterです。
ファイルオブジェクトのメソッドwriteなどを使うとデータをファイルに書き込むことが出来ます。

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

  • バイナリファイルを書き込みモードで開く

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

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

  • バイト列をバイナリファイルに書き込む

  • 文字列をバイナリファイルに書き込むと……

  • 文字列をバイナリファイルに書き込むには?

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

バイナリファイルを書き込みモードで開く

バイナリファイルを書き込みモードで開くにはopen関数を↓のようにして使います。

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

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

mode引数には文字列wbを指定します。
wbwrite binaryの略です。

モードwbを指定すると、open関数は指定したパスのファイルを新規作成してファイルを開きます。
指定したパスのファイルが既に存在する場合は、そのファイルの中身を空にしてファイルを開きますので注意が必要です。
あやまって大切なデータが入っているファイルを空にしてしまわないようにしましょう。

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

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

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

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

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

<class '_io.BufferedWriter'>

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

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

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

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

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

True

ちなみにreadableというメソッドもあります。
これはファイルオブジェクトが読み込み可能な時にTrueを返し、読み込み不可能な時にFalseを返します。

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

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

False

バイト列をバイナリファイルに書き込む

開いたファイルオブジェクトにデータ(バイト列)を書き込むにはwriteメソッドを使います。

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

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

abc

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

文字列をバイナリファイルに書き込むと……

ためしに文字列をバイナリファイルに書き込んでみましょう。

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

すると↓のようなエラーになります。

Traceback (most recent call last):
  File ".\sample.py", line 2, in <module>
    fout.write('abc')
TypeError: a bytes-like object is required, not 'str'

「文字列でなくバイト列のようなオブジェクトを渡してください」というエラーですね。
このようにwriteメソッドに文字列を渡すことは出来ません。

文字列をバイナリファイルに書き込むには?

文字列をバイナリファイルに書き込むには文字列をバイト列にする必要があります。
文字列をバイト列にするには文字列のメソッドencodeを使います。
たとえば↓のようにです。

with open('alphas.dat', mode='wb') as fout:
    data = 'abc'.encode('utf-8')
    fout.write(data)

encodeメソッドの第1引数にはエンコーディングを指定します。
↑の例では文字列abcutf-8のエンコーディングでバイト列にしています。

また、バイト列を文字列にしたい場合はdecodeメソッドを使います。
encode, decodeメソッドの詳細については↓のバイト列の記事をご覧ください。

おわりに

前回はバイナリファイルからの読み込み、そして今回はバイナリファイルへの書き込みについてやりました。
これでバイナリファイルを利用したプログラムを作ることが可能になりそうです。
高度なバイナリファイルの扱いではランダムアクセスの知識が必要ですが、これについては別の記事で解説します。

以上、次回に続きます。

また見てね

関連動画





スポンサーリンク

スポンサーリンク

スポンサーリンク

スポンサーリンク