文字列をBase64エンコードされた文字列に
import base64
text = '~~~ Hello? ~~~'
base64Bytes = base64.b64encode(text.encode())
# 結果 fn5+IEhlbGxvPyB+fn4=
print(base64Bytes.decode())
Base64 にエンコードするには base64.b64encode 関数を使用します。引数 と 戻り値 が bytes型 のため、型変換が必要です。
- 4行目: encode 関数で string型 を bytes型 に変換しています。
- 7行目: 戻り値は bytes型 のため、decode 関数で string型に変換しています。
Base64エンコードされた文字列を戻す
import base64
base64String = 'fn5+IEhlbGxvPyB+fn4='
textBytes = base64.b64decode(base64String.encode())
# 結果 ~~~ Hello? ~~~
print(textBytes.decode())
- 4行目: encode 関数で string型 を bytes型 に変換しています。
- 7行目: 戻り値は bytes型 のため、decode 関数で string型に変換しています。
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)
- 6行目: 例外 binascii.Error を捕捉しています。
ファイル名 や 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())
- 9行目 ~ 10行目: ファイルを 'wb'(バイナリ書き込み) モード で開いた場合、write 時の decode 関数は不要です。
検証環境
- Python 3.9.0 (tags/v3.9.0:9cf6752, Oct 5 2020, 15:34:40) [MSC v.1927 64 bit (AMD64)] on win32
- Python 3.9.7 (default, Sep 3 2021, 20:10:26) [GCC 10.2.1 20210110] on linux
- Docker image: python
- Docker Desktop 4.0.1(68347)
- Docker Engine 20.10.8
- Docker Compose 1.29.2
- Microsoft Windows 10 Pro Version 21H1 OS Build 19043.1288 Experience: Windows Feature Experience Pack 120.2212.3920.0