Python - Base64 エンコード・デコード

Base64エンコード・デコードを行うには標準ライブラリの base64 モジュールを使用します。

文字列をBase64エンコードされた文字列に

import base64

text = '~~~ Hello? ~~~'
base64Bytes = base64.b64encode(text.encode())

# 結果 fn5+IEhlbGxvPyB+fn4=
print(base64Bytes.decode())

Base64 にエンコードするには base64.b64encode 関数を使用します。引数 と 戻り値 が bytes型 のため、型変換が必要です。

Base64エンコードされた文字列を戻す

import base64

base64String = 'fn5+IEhlbGxvPyB+fn4='
textBytes = base64.b64decode(base64String.encode())

# 結果 ~~~ Hello? ~~~
print(textBytes.decode())
デコードするには base64.b64decode 関数を使用します。引数 と 戻り値 が bytes型 のため、型変換が必要です。

Base64エンコード時、不正な文字をエラーにする

base64.b64decode 関数は Base64 で使用されない文字を無視して変換を試みます。 引数 validate=True を指定すると無視をせず、例外 binascii.Error が発生するようになります。

※ validate=True を省略しても エンコードできない文字の組み合わせ は 例外 binascii.Error が発生します。

# 結果は空文字列 (不正文字 'あいうえお' は無視される)
base64.b64decode('あいうえお'.encode())
# 例外 binascii.Error (不正文字がエラーになる)
base64.b64decode('あいうえお'.encode(), validate=True)

# 結果は Hello (不正文字は無視される)
base64.b64decode('あいうえおSGVsbG8='.encode())
# 例外 binascii.Error (不正文字がエラーになる)
base64.b64decode('あいうえおSGVsbG8='.encode(), validate=True)

# 例外 binascii.Error (不正文字はないが、変換できない)
base64.b64decode('AAA'.encode())
base64.b64decode('AAA'.encode(), validate=True)

エラー処理の例

import base64
import binascii

try:
    textBytes = base64.b64decode('あいうえお'.encode(), validate=True)
except binascii.Error as e:
    # デコード失敗
    print(e)

ファイル名 や URLパラメーター用にエンコードする

Base64 結果には '/' と '+' が含まれるため、そのままではファイル名 や URLパラメーターに使用できません。base64.urlsafe_b64encode 関数を使用すると '/' は '-'、 '+' は '_' で出力されます。

※ urlsafe_b64encode 関数 でエンコードした場合、urlsafe_b64decode 関数で元に戻します。

import base64

# 結果は Pz8/fn5+
base64Bytes = base64.b64encode('???~~~'.encode())
print(base64Bytes.decode())

# 結果は Pz8_fn5-
base64Bytes = base64.urlsafe_b64encode('???~~~'.encode())
print(base64Bytes.decode())

# urlsafe_b64encode で エンコードしたら urlsafe_b64decode で戻す
textBytes = base64.urlsafe_b64decode(base64Bytes)
print(textBytes.decode())

画像ファイル(バイナリファイル) を Base64 のテキストファイルにする

import base64

# 画像ファイルをバイナリモードで開く
with open('./image.png', 'rb') as fr:
    # ファイルを読み取り、Base64 に変換
    textBytes = base64.b64encode(fr.read())

    # テキストファイルに保存
    with open('./image.txt', 'wt') as fw:
        fw.write(textBytes.decode())

検証環境