PythonでのBase64
Pythonのbase64モジュールを使ったBase64エンコード・デコードの完全ガイド。文字列、ファイル、URL-safe変換、バイナリデータの扱い方を網羅的に解説します。
Language
詳細な説明
Pythonの base64 モジュール(標準ライブラリの一部)は、Base64エンコードとデコードのための包括的な関数群を提供します。JavaScriptと異なり、Pythonはバイト文字列(bytes)とテキスト文字列(str)を明確に区別しており、正しく扱う必要があります。
基本的な文字列のエンコードとデコード:
import base64
# Encoding: str -> bytes -> base64 bytes -> str
text = "Hello, World!"
encoded = base64.b64encode(text.encode("utf-8")).decode("ascii")
print(encoded) # "SGVsbG8sIFdvcmxkIQ=="
# Decoding: str -> bytes -> decoded bytes -> str
decoded = base64.b64decode(encoded).decode("utf-8")
print(decoded) # "Hello, World!"
重要なポイントは、b64encode() は bytes を受け取り bytes を返すことです。最初に文字列を .encode("utf-8") でバイト列にし、結果が文字列として必要なら .decode("ascii") する必要があります。
ファイルのエンコード:
import base64
# Encode a file
with open("image.png", "rb") as f:
encoded = base64.b64encode(f.read()).decode("ascii")
# Decode back to file
with open("output.png", "wb") as f:
f.write(base64.b64decode(encoded))
URL-safe Base64:
# Uses - and _ instead of + and /
encoded = base64.urlsafe_b64encode(data).decode("ascii")
decoded = base64.urlsafe_b64decode(encoded)
その他利用可能なバリエーション:
base64.b32encode()/b32decode()-- Base32エンコードbase64.b16encode()/b16decode()-- Base16(16進数)base64.a85encode()/a85decode()-- Ascii85エンコードbase64.encodebytes()-- 76文字ごとに改行を追加(MIMEスタイル)
Pythonでよくある間違い:
bytesではなくstrを直接b64encode()に渡してしまう。TypeErrorが発生します。- 改行付きのMIME形式の出力が必要なのに
b64encode()を使用してしまう。代わりにencodebytes()を使いましょう。 - ファイルをバイナリモード(
"rb"/"wb")で開き忘れる。Windowsではエンコードエラーやファイル破損を引き起こします。 - 外部ソースからのURL-safe Base64をデコードする際にパディングを正しく処理しない。Pythonの
urlsafe_b64decode()はパディング欠如に寛容ですが、明示的に追加する方が安全です。
ユースケース
専用のファイルストレージサービスがない環境で、アップロードされたドキュメントファイルをBase64文字列としてエンコードし、PostgreSQLのJSONBカラムに格納する場合に使用します。