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カラムに格納する場合に使用します。

試してみる — Base64 Encoder

フルツールを開く