【Python】バイナリファイルへの書き込み(モードwb)【入門第61回】
目次
- バイナリファイルにデータを書き込む
- バイナリファイルを書き込みモードで開く
- ファイルオブジェクトのタイプ
- ファイルオブジェクトが書き込み可能かチェックする
- バイト列をバイナリファイルに書き込む
- 文字列をバイナリファイルに書き込むと……
- 文字列をバイナリファイルに書き込むには?
- おわりに
- 関連動画
バイナリファイルにデータを書き込む
こんにちは、narupoです。
今回も前回に引き続きPythonのファイル入出力についてです。
今回は、バイナリファイルにデータを書き込む方法を解説します。
バイナリファイルにデータを書き込むにはopen
関数のmode
引数にwb
を指定してファイルを開きます。
開いたファイルオブジェクトのタイプは_io.BufferedWriter
です。
ファイルオブジェクトのメソッドwrite
などを使うとデータをファイルに書き込むことが出来ます。
具体的には↓を見ていきます。
バイナリファイルを書き込みモードで開く
ファイルオブジェクトのタイプ
ファイルオブジェクトが書き込み可能かチェックする
バイト列をバイナリファイルに書き込む
文字列をバイナリファイルに書き込むと……
文字列をバイナリファイルに書き込むには?
ほかのファイル入出力についての入門記事は↓をご覧ください。
- 【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='wb') as fout:
pass
open
関数の第1引数にファイルのパスを指定します。
mode
引数には文字列wb
を指定します。
wb
はwrite binary
の略です。
モードwb
を指定すると、open
関数は指定したパスのファイルを新規作成してファイルを開きます。
指定したパスのファイルが既に存在する場合は、そのファイルの中身を空にしてファイルを開きますので注意が必要です。
あやまって大切なデータが入っているファイルを空にしてしまわないようにしましょう。
open
関数の詳細な使い方は↓の記事をご覧ください。
ファイルオブジェクトのタイプ
wb
モードで開いたファイルオブジェクトのタイプは_io.BufferedWriter
です。
:::python
with open('alphas.dat', mode='wb') 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 ドキュメント
ファイルオブジェクトが書き込み可能かチェックする
wb
モードで開いたファイルオブジェクトが書き込み可能かどうか確かめるにはwritable
メソッドを使います。
writable
メソッドはファイルオブジェクトが書き込み可能な時にTrue
, 書き込み不可能な時にFalse
を返します。
:::python
with open('alphas.dat', mode='wb') as fout:
print(fout.writable())
↑のコードの実行結果は↓のようになります。
:::text
True
ちなみにreadable
というメソッドもあります。
これはファイルオブジェクトが読み込み可能な時にTrue
を返し、読み込み不可能な時にFalse
を返します。
:::python
with open('alphas.dat', mode='wb') as fout:
print(fout.readable())
↑のコードの実行結果は↓のようになります。
:::text
False
バイト列をバイナリファイルに書き込む
開いたファイルオブジェクトにデータ(バイト列)を書き込むにはwrite
メソッドを使います。
:::python
with open('alphas.dat', mode='wb') as fout:
fout.write(b'abc')
↑のコードを実行するとalphas.dat
の内容は↓のようになります。
abc
b'abc'
はPythonではバイト列を表します。
バイト列については↓の記事をご覧ください。
文字列をバイナリファイルに書き込むと……
ためしに文字列をバイナリファイルに書き込んでみましょう。
:::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
を使います。
たとえば↓のようにです。
:::python
with open('alphas.dat', mode='wb') as fout:
data = 'abc'.encode('utf-8')
fout.write(data)
encode
メソッドの第1引数にはエンコーディングを指定します。
↑の例では文字列abc
をutf-8
のエンコーディングでバイト列にしています。
また、バイト列を文字列にしたい場合はdecode
メソッドを使います。
encode, decodeメソッドの詳細については↓のバイト列の記事をご覧ください。
おわりに
前回はバイナリファイルからの読み込み、そして今回はバイナリファイルへの書き込みについてやりました。
これでバイナリファイルを利用したプログラムを作ることが可能になりそうです。
高度なバイナリファイルの扱いではランダムアクセスの知識が必要ですが、これについては別の記事で解説します。
以上、次回に続きます。
また見てね