Python

Pythonを使ってBase64の書き方を解説

2021年10月4日

Python Base64

Pythonを使ってBase64の使い方を解説していきます。

そもそも、Base64ってどういったところで使うのかと言うと、Webページの画像をbase64にしたりすることで大量のデータの時に有効に利用することができます。

他にも、APIのヘッダーとかでデータをエンコードして送信したりします。

そのため、Base64によるエンコードとデコードの方法は覚えておく必要があります。

コード自体もカンタンなので、ぜひ覚えてください。

Base64とは

Base64とは

Base64とは、64種類の印字可能な英数字を利用して、バイナリデータなどをエンコードして文字列として通信したりします。

画像をバイナリではなくテキストで扱うため、たくさんの画像を取り扱ったりする際に有効です。

通信する際にバイナリだと処理とかめんどくさいのですが、base64にするだけでカンタンに処理できるので結構使ったりします。

エンコードとデコードについて

エンコードとは、ある形式のデータを一定の規則に基づいて別の形式にデータを変換します。

デコードはその逆で、一定の規則に変換されたデータを元のデータに戻します。

Base64のエンコードの方法

Base64エンコード

Pythonでbase64にエンコードするには、base64をインポートします。

その中にある、b64encodeを使って変換します。

変換する際の注意点として、bytesであることです。

そうしないと、下記のようにbytesを使いなさいって感じのエラーになります。

TypeError: a bytes-like object is required, not 'str'

このエラーが出たら、byteにしましょう。

テキストのエンコード

import base64

txt = 'Hello Worldをエンコード'
print(base64.b64encode(txt.encode())

説明すると「Hello Worldをエンコード」というテキストをbase64に変更しているプログラムです。

txt.encode()の部分でbytesに変換しています。

エンコードされた結果が下記になります。

b'SGVsbG8gV29ybGTjgpLjgqjjg7PjgrPjg7zjg4k='

画像のエンコード

次に下記のキャプチャ画像をbase64にエンコードします。

base64エンコード

バイナリ画像を読み込む方法は、JSONやTOMLやテキストファイルといった読み込み方法と同じでopenを利用します。

Pythonファイル操作
Pythonでいろんな種類のファイルを操作方法を解説
Pythonを使って、テキストやJSON、YAMLといったさまざまなファイルの読み書きに関してピックアップしてみました。 調べてみてわかったことは、ほとんどのモジュールが書き込みと読み込みで同じような書き方になっていました。 そのため、数種 ...

続きを見る

テキストやJSONファイルの読み込みには、モードのオプションをrとして指定したり省略したりしましたが、バイナリの場合はrbを指定します。

実際のコードが下記になります。

import base64

img_path = './エンコード処理.png'

with open(img_path, 'rb') as f:
    print(base64.b64encode(f.read()))

テキストと違って、画像はreadを使うことでbytesとして取り扱うのでencode()でbytesに変換する必要はありません。

そのため、b64encodeに直接read()を入れます。

下記が結果になります。

b'iVBORw0KGgoAAAANSUhEUgAAAxoAAAD6CAYK・・・ # 長いので省略しています。

Base64のデコードの書き方

Base64デコード

Pythonを使ったBase64のデコードは、b64decodeを利用します。

エンコードの時とは、逆の手順で進めることで元に戻します。

テキストのデコード

base64にエンコードしたテキストを元に戻します。

今回は、テキストのエンコードで利用したデータを使います。

txtの部分がそのデータになります。

import base64

txt = b'SGVsbG8gV29ybGTjgpLjgqjjg7PjgrPjg7zjg4k='
print(base64.b64decode(txt))

このコードの結果は、下記になります。

b'm!\x95\xb1\xb1\xbc\x81]\xbd\xc9\xb1\x93\x8e\nK\x8e\n\xa3\x8e\x0e\xcf\x8e\n\xcf\x8e\x0e\xf3\x8e\x0e$'

あれ?って思うかもしれませんが、エンコードと逆の手順で進めなければいけないので、bytesから変換しなければいけません。

テキストをエンコードした時は、テキスト -> bytesに変換 -> base64にエンコード変換。

デコードするには、base64をデコード -> bytesをテキストに変換 -> テキストになる。

b64decodeにdecodeをつけなければいけません。

import base64

txt = b'SGVsbG8gV29ybGTjgpLjgqjjg7PjgrPjg7zjg4k='
print(base64.b64decode(txt).decode())  #  decodeを追加

txt.decodeではなく、b64decodeにdecodeをつけます。

そうすることで、元のテキストに戻すことができます。

下記がその結果です。

Hello Worldをエンコード

画像をデコード

画像のデコードもテキストと同じでカンタンです。

画像もエンコードで利用した画像を使います。

バイナリはprintでは表示できないので、画像として再度保存し直すことにしました。

バイナリを保存するには、モードとして「bw」を指定します。

import base64

file_path = './画像.png'

with open(file_path, 'bw') as f:
    img_en = b'iVBORw0KGgoAAAANSa・・・' # 長いので省略しています。
    img_de = base64.b64decode(img_en)
    f.write(img_de)

b64decodeで変換したデータをwriteで書き込むだけで画像として元に戻ります。

まとめ

Pythonを使ってbase64を行ってみました。

今回行ったのは、テキストと画像でバイナリも文字列としてエンコードすることができます。

そうすることで、データの通信を行う際にバイナリを使わずテキストとして利用できるため、ラクです。

でも、Pythonのbase64の変換って結構めんどくさくて、JavaScriptやPHPとかはbytesに戻さなくて良いので、コード書くときにその辺忘れてしまいガチになるので注意してください。

Udemyへ

今後の人生を豊かにする為にキャリアアップのステップとして、自分への投資をしてみませんか?

-Python
-