Web APIやメール添付などで受け取った「Base64エンコードされた文字列」を、元のバイナリデータ(画像、PDF、音声ファイルなど)に戻して保存するには、標準ライブラリ base64 モジュールの b64decode() 関数を使用します。
ここでは、受信したBase64文字列をデコードし、PNG画像ファイルとして保存する実装方法を解説します。
目次
実装例:受信データの復元と保存
サーバーから受け取ったと仮定したBase64文字列をデコードし、ローカルに restored_image.png という名前で保存するシナリオです。
ソースコード
import base64
# 1. デコード対象のBase64文字列
# (実際にはAPIレスポンスなどで受け取った非常に長い文字列が入ります)
# ここでは例として、短いダミーデータを使用しています
received_b64_str = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg=="
# 2. Base64文字列をバイナリデータ(bytes)にデコード
# b64decode() は str型 または bytes型 を受け取り、デコード後の bytes型 を返します
decoded_data = base64.b64decode(received_b64_str)
# 3. バイナリ書き込みモード('wb')でファイルを開いて保存
# テキストではないため 'w' ではなく 'wb' (Write Binary) を指定します
output_filename = "restored_image.png"
try:
with open(output_filename, "wb") as f:
f.write(decoded_data)
print(f"保存完了: {output_filename}")
print(f"ファイルサイズ: {len(decoded_data)} bytes")
except Exception as e:
print(f"保存に失敗しました: {e}")
実行結果
保存完了: restored_image.png
ファイルサイズ: 70 bytes
解説
base64.b64decode(s)
Base64形式の文字列(またはバイト列)を受け取り、元のバイナリデータ(bytes 型)に変換します。 入力文字列に正しくない文字が含まれていたり、パディング(末尾の =)が不足していたりすると binascii.Error が発生することがあります。
ファイルモード wb (Write Binary)
デコードされたデータは画像や音声などのバイナリデータです。 これをファイルに書き込む際は、必ず "wb" モードを指定してください。
"w": テキスト書き込みモード(文字コード変換などが起きるため、バイナリデータには不適)"wb": バイナリ書き込みモード(データをそのまま書き込む)- ※ユーザー様が提示された
"bw"というモード指定はPythonでは無効ですので、"wb"と記述します。
注意点:ヘッダーの除去
Webアプリケーションなどで data:image/png;base64,iVBORw... のような形式(Data URI Scheme)でデータを受け取った場合、先頭の data:image/...;base64, というヘッダー部分はBase64の本体ではないため、デコード前に除去(置換やスライス)する必要があります。
