【Python】バイナリファイルの読み込み(モードrb)【入門第60回】
目次
バイナリファイルの読み込み
こんにちは、narupoです。
今回も前回に引き続きPythonのファイル入出力についてです。
今回はバイナリファイルの読み込み方法について解説します。
バイナリファイルを読み込むには、まずopen
関数の引数mode
にrb
を指定してファイルを開きます。
開いたファイルオブジェクトのタイプは_io.BufferedReader
です。
ファイルオブジェクトのメソッド、read
などを使ってバイナリファイルのデータを読み込むことができます。
具体的には↓を見ていきます。
バイナリファイルとは?
サンプルとするファイル
バイナリファイルを開く
ファイルオブジェクトのタイプ
readメソッドでデータを読み込む
ほかのファイル入出力についての入門記事は↓をご覧ください。
- 【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回】
バイナリファイルとは?
そもそものバイナリファイルとは一体何なのかという話です。
コンピューターは電圧をデジタル的に表現した0
と1
しか理解することが出来ません。
しかし0
と1
が使えれば色々な数を表現することが可能です。
この0
と1
で数を表現する方法を二進法と言います。
バイナリ(binary)は翻訳すると二進法のことですが、コンピューターの分野ではバイナリデータのことを指す時にも使われます。
バイナリデータとはバイト(byte
)の並びのことであり、バイトとはビット(bit
)が8
つ並んだものです(厳密には8
つじゃない時もあります)。そしてbit
とは先ほどの2進数のこと、つまり0
か1
のことです。
そしてバイナリファイルとはバイナリデータを持っているファイルのことを言います。
皆さんがよく使っているファイルは基本的にはこのバイナリファイルです。
テキストファイルもカテゴリ的にはバイナリファイルの配下です。
バイナリファイルの中で、特に文字列のエンコーディングで保存されているものをテキストファイルと言います。
open
関数でテキストファイルを開くと、open
関数は自動的にデータをバイト列からPythonの文字列にデコードします。
そのため、データをデコードしてほしくないケースではopen
関数にバイナリモードを指定してファイルを開きます。
そうすることで生のバイト列のデータを得ることが出来るわけです。
サンプルとするファイル
今回の解説で読み込みに使うファイルは↓のようなデータが書かれたalphas.dat
ファイルです。
:::text
abcdefghijklmnopqrstuvwxyz
バイナリファイルを開く
バイナリファイルを開くにはopen
関数を↓のように使います。
:::python
with open('alphas.dat', mode='rb') as fin:
pass
open
関数の第1引数にファイルのパスを指定します。
mode
引数に文字列のrb
を指定します。
rb
はread binary
の略です。
バイナリファイルを開く場合はencoding
の指定は必要ありません。
バイト列を文字列にデコードせずそのまま読み込むからです。
open
関数の具体的な使い方については↓の記事をご覧ください。
ファイルオブジェクトのタイプ
モードrb
で開いたファイルオブジェクトのタイプは_io.BufferedReader
です。
:::python
with open('alphas.dat', mode='rb') as fin:
pass
↑のコードの実行結果は↓のようになります。
:::text
<class '_io.BufferedReader'>
このクラスはio.BufferedIOBase
を継承し、さらにio.BufferedIOBase
はio.IOBase
を継承しています。
これら2つの公式ドキュメントを見れば使えるメソッドを一望できます。
- io --- ストリームを扱うコアツール — io.BufferedIOBase — Python 3.7.4 ドキュメント
- io --- ストリームを扱うコアツール — io.IOBase — Python 3.7.4 ドキュメント
readメソッドでデータを読み込む
バイナリファイルからデータを読み込むには、ファイルオブジェクトのread
メソッドを使います。
:::python
with open('alphas.dat', mode='rb') as fin:
content = fin.read()
print(content)
↑のコードの実行結果は↓のようになります。
:::text
b'abcdefghijklmnopqrstuvwxyz'
先頭にb
が付いてデータがシングルクオート('
)で囲まれています。
これはPythonのbytes
リテラルで、byte
列を表しています。
byte
列はbytes
クラスから作られるPythonのデータ型です。
↓のようにするとbyte
列を作ることが出来ます。
:::python
# 空のバイト列
data = bytes()
# bytesリテラル
data = b'abc'
おわりに
バイナリファイルを読み込めるようになると、画像処理などの低レイヤ―な処理が書けるようになります。
バイナリデータをプログラム側で読み込みんでそのデータを加工して再びバイナリファイルへ書き出すなどですね。
ただ、Pythonの画像処理ではPillow
などのライブラリを使うのが一般的なので、直接バイナリを扱うケースはなかなか無いかもしれません。
しかし、低レイヤ―なプログラムを書きたいという人は避けては通れない道と言っていいでしょう。
バイナリファイルを解析したり、パケットのデータを解析したりとか、そういうのが好きな人ですね。
私もC言語やってた経歴があるので、たまに低レイヤ―な処理を書きたくなります。
ハッカーを目指す人は低レイヤ―な処理は一般教養なので頑張ってください。
目指せスーパハカー
以上、次回に続きます。
また見てね