【Python】バイナリファイルの読み込み(モードrb)【入門第60回】

184, 2019-09-19

目次

バイナリファイルの読み込み

こんにちは、narupoです。

今回も前回に引き続きPythonのファイル入出力についてです。
今回はバイナリファイルの読み込み方法について解説します。
バイナリファイルを読み込むには、まずopen関数の引数moderbを指定してファイルを開きます。
開いたファイルオブジェクトのタイプは_io.BufferedReaderです。
ファイルオブジェクトのメソッド、readなどを使ってバイナリファイルのデータを読み込むことができます。

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

  • バイナリファイルとは?

  • サンプルとするファイル

  • バイナリファイルを開く

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

  • readメソッドでデータを読み込む

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

バイナリファイルとは?

そもそものバイナリファイルとは一体何なのかという話です。
コンピューターは電圧をデジタル的に表現した01しか理解することが出来ません。
しかし01が使えれば色々な数を表現することが可能です。
この01で数を表現する方法を二進法と言います。

バイナリ(binary)は翻訳すると二進法のことですが、コンピューターの分野ではバイナリデータのことを指す時にも使われます。
バイナリデータとはバイト(byte)の並びのことであり、バイトとはビット(bit)が8つ並んだものです(厳密には8つじゃない時もあります)。そしてbitとは先ほどの2進数のこと、つまり01のことです。
そしてバイナリファイルとはバイナリデータを持っているファイルのことを言います。

皆さんがよく使っているファイルは基本的にはこのバイナリファイルです。
テキストファイルもカテゴリ的にはバイナリファイルの配下です。
バイナリファイルの中で、特に文字列のエンコーディングで保存されているものをテキストファイルと言います。

open関数でテキストファイルを開くと、open関数は自動的にデータをバイト列からPythonの文字列にデコードします。
そのため、データをデコードしてほしくないケースではopen関数にバイナリモードを指定してファイルを開きます。
そうすることで生のバイト列のデータを得ることが出来るわけです。

サンプルとするファイル

今回の解説で読み込みに使うファイルは↓のようなデータが書かれたalphas.datファイルです。

abcdefghijklmnopqrstuvwxyz

バイナリファイルを開く

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

with open('alphas.dat', mode='rb') as fin:
    pass

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

mode引数に文字列のrbを指定します。
rbread binaryの略です。

バイナリファイルを開く場合はencodingの指定は必要ありません。
バイト列を文字列にデコードせずそのまま読み込むからです。

open関数の具体的な使い方については↓の記事をご覧ください。

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

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

with open('alphas.dat', mode='rb') as fin:
    pass

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

<class '_io.BufferedReader'>

このクラスはio.BufferedIOBaseを継承し、さらにio.BufferedIOBaseio.IOBaseを継承しています。
これら2つの公式ドキュメントを見れば使えるメソッドを一望できます。

readメソッドでデータを読み込む

バイナリファイルからデータを読み込むには、ファイルオブジェクトのreadメソッドを使います。

with open('alphas.dat', mode='rb') as fin:
    content = fin.read()
    print(content)

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

b'abcdefghijklmnopqrstuvwxyz'

先頭にbが付いてデータがシングルクオート(')で囲まれています。
これはPythonのbytesリテラルで、byte列を表しています。
byte列はbytesクラスから作られるPythonのデータ型です。

↓のようにするとbyte列を作ることが出来ます。

# 空のバイト列
data = bytes()

# bytesリテラル
data = b'abc'

おわりに

バイナリファイルを読み込めるようになると、画像処理などの低レイヤ―な処理が書けるようになります。
バイナリデータをプログラム側で読み込みんでそのデータを加工して再びバイナリファイルへ書き出すなどですね。
ただ、Pythonの画像処理ではPillowなどのライブラリを使うのが一般的なので、直接バイナリを扱うケースはなかなか無いかもしれません。
しかし、低レイヤ―なプログラムを書きたいという人は避けては通れない道と言っていいでしょう。
バイナリファイルを解析したり、パケットのデータを解析したりとか、そういうのが好きな人ですね。
私もC言語やってた経歴があるので、たまに低レイヤ―な処理を書きたくなります。
ハッカーを目指す人は低レイヤ―な処理は一般教養なので頑張ってください。

目指せスーパハカー

以上、次回に続きます。

また見てね

関連動画





スポンサーリンク

スポンサーリンク

スポンサーリンク

スポンサーリンク