API が eyJob3N0IjogImRiLXByb2Qi… のような content フィールドを返したとき、 シークレットマネージャーがエンコードされた認証情報を渡してきたとき、または JWT ペイロードを抽出する必要があるとき—— Python base64 デコードが最初の選択肢です。 組み込みの base64 モジュールはすべてに対応していますが、bytes と文字列の違い、 URL セーフアルファベット、そしてパディング不足に関する細部がほぼすべての開発者を一度は引っかかります—— 私はコードレビューでこの種のエラーをデバッグした回数を認めたくないほど経験しています。 このガイドでは base64.b64decode()、urlsafe_b64decode()、 自動パディング修復、ファイルと HTTP レスポンスからのデコード、CLI ツール、 入力バリデーション、そして 4 つの一般的なミスと修正前後の例を取り上げます—— すべて Python 3.8+ で実行可能なサンプルです。 コードを書かずに素早く一度だけデコードしたい場合は、 ToolDeck の Base64 Decoder がブラウザ上で 標準と URL セーフの両方の Base64 を即座に処理します。
- ✓base64.b64decode(s) は Python 標準ライブラリに組み込まれており、インストール不要。常に bytes を返し、str は返しません。
- ✓b64decode() の後に .decode("utf-8") をチェーンして bytes を Python 文字列に変換します——この関数は元のテキストエンコーディングを知りません。
- ✓URL セーフな Base64(+ と / の代わりに - と _ を使用)には base64.urlsafe_b64decode() を使用します——JWT、OAuth トークン、Google API 認証情報での標準です。
- ✓一般的な "Incorrect padding" エラーは次の式で修正: padded = s + "=" * (-len(s) % 4)——必要に応じて 0、1、または 2 文字を追加します。
- ✓外部ソースからの入力には validate=True を設定して、非 Base64 文字を無視する代わりに binascii.Error を発生させます。
Base64 デコードとは?
Base64 は任意のバイナリデータを 64 種類の印刷可能な ASCII 文字で表現するエンコーディング方式です:A–Z、a–z、0–9、+、/、 そしてパディングとして = を使用します。Base64 の 4 文字がちょうど元の 3 バイトをエンコードするため、 エンコードされた形式はソースより約 33% 大きくなります。 デコードはその逆処理——ASCII 表現を元のバイトに戻します。
Base64 はデータを暗号化しません。純粋なバイナリ-テスト変換エンコーディングです—— デコーダーを通せば誰でもエンコードされた文字列を完全に読むことができます:
前——Base64 エンコード済み
eyJob3N0IjogImRiLXByb2QubXljb21wYW55LmludGVybmFsIiwgInBvcnQiOiA1NDMyLCAidXNlciI6ICJhcHBfc3ZjIn0=後——デコード済み
{"host": "db-prod.mycompany.internal", "port": 5432, "user": "app_svc"}base64.b64decode() — 標準ライブラリによるデコード
Python の base64 モジュールは標準ライブラリに含まれており——インストール不要で常に利用可能です。 主要な関数は base64.b64decode(s, altchars=None, validate=False) です。str、bytes、bytearray を受け取り、常に bytes を返します。
最小限の動作例
import base64
import json
# Encoded database config received from a secrets manager
encoded_config = (
"eyJob3N0IjogImRiLXByb2QubXljb21wYW55LmludGVybmFsIiwgInBvcnQiOiA1NDMyLCAid"
"XNlciI6ICJhcHBfc3ZjIiwgInBhc3N3b3JkIjogInM0ZmVQYXNzITIwMjYifQ=="
)
# Step 1: decode Base64 bytes
raw_bytes = base64.b64decode(encoded_config)
print(raw_bytes)
# b'{"host": "db-prod.mycompany.internal", "port": 5432, "user": "app_svc", "password": "s4fePass!2026"}'
# Step 2: convert bytes → str
config_str = raw_bytes.decode("utf-8")
# Step 3: parse into a dict
config = json.loads(config_str)
print(config["host"]) # db-prod.mycompany.internal
print(config["port"]) # 5432b64decode() は常に bytes を返します——文字列ではありません。 元のデータがテキストの場合は .decode("utf-8") をチェーンしてください。 バイナリデータ(画像、PDF、gzip アーカイブ)の場合は bytes をそのままにして ファイルに書き込むか、対応するライブラリに直接渡してください。拡張例:sort_keys、ensure_ascii、厳密なバリデーション
import base64
import binascii
# Token from an internal event bus — validate strictly (external input)
encoded_event = (
"eyJldmVudCI6ICJvcmRlci5zaGlwcGVkIiwgIm9yZGVyX2lkIjogIk9SRC04ODQ3MiIsICJ"
"0aW1lc3RhbXAiOiAiMjAyNi0wMy0xM1QxNDozMDowMFoiLCAicmVnaW9uIjogImV1LXdlc3QtMSJ9"
)
try:
# validate=True raises binascii.Error on any non-Base64 character
raw = base64.b64decode(encoded_event, validate=True)
event = raw.decode("utf-8")
print(event)
# {"event": "order.shipped", "order_id": "ORD-88472", "timestamp": "2026-03-13T14:30:00Z", "region": "eu-west-1"}
except binascii.Error as exc:
print(f"Invalid Base64: {exc}")
except UnicodeDecodeError as exc:
print(f"Not UTF-8 text: {exc}")URL セーフな Base64(base64url)のデコード
標準 Base64 は URL で予約文字である + と /を使用します。 URL セーフバリアント(RFC 4648 §5、“base64url” とも呼ばれる)では - と _ に置き換えられます。 JWT トークン、OAuth 2.0 PKCE チャレンジ、Google Cloud 認証情報、 そして最新の Web 認証フローのほとんどでこのエンコーディングが使用されています。
アルファベットを調整せずに URL セーフな Base64 を b64decode() に渡すと、 データが静かに破損するか binascii.Error が発生します。 代わりに base64.urlsafe_b64decode() を使用してください——- → + および _ → / の置換を自動で処理します。
import base64
import json
# JWT payload segment (the middle part between the two dots)
# JWTs use URL-safe Base64 without trailing "=" padding
jwt_payload_b64 = (
"eyJ1c2VyX2lkIjogMjg5MywgInJvbGUiOiAiYWRtaW4iLCAiaXNzIjogImF1dGgubXljb21w"
"YW55LmNvbSIsICJleHAiOiAxNzQwOTAwMDAwLCAianRpIjogImFiYzEyMzQ1LXh5ei05ODc2In0"
)
# Restore padding before decoding (JWT deliberately omits '=')
padded = jwt_payload_b64 + "=" * (-len(jwt_payload_b64) % 4)
payload_bytes = base64.urlsafe_b64decode(padded)
payload = json.loads(payload_bytes.decode("utf-8"))
print(payload["role"]) # admin
print(payload["iss"]) # auth.mycompany.com
print(payload["user_id"]) # 2893"=" * (-len(s) % 4) は必要に応じてちょうど 0、1、または 2 個のパディング文字を追加し、 文字列がすでに正しくパディングされている場合は何もしません。 JWT と OAuth のパディング問題に対する Python の慣用的な修正方法です。base64.b64decode() パラメータリファレンス
以下のパラメータはすべて b64decode() と urlsafe_b64decode() の両方に適用されますが、altchars は b64decode() のみで使用できます。
| パラメータ | 型 | デフォルト | 説明 |
|---|---|---|---|
| s | bytes | str | bytearray | — | デコードする Base64 エンコード済み入力。bytes 型に加えて ASCII str も受け入れます。 |
| altchars | bytes | None | None | + と / を置換する 2 バイトのシーケンス。標準 URL セーフバリアント以外のカスタム Base64 アルファベットを使用できます。 |
| validate | bool | False | True の場合、Base64 アルファベット外の文字があると binascii.Error を発生させます。False の場合、非アルファベットのバイト(改行、スペース)は無視されます。 |
validate=False のデフォルトは PEM フォーマットのデータや複数行の Base64(改行が一般的)に対して意図的なものです。 API ペイロード、ユーザーアップロード、または信頼できない入力にはvalidate=True を渡して、破損または注入されたデータを早期に検出し、 明確なエラーメッセージを表示してください。
Python Base64 デコードのパディングエラー——修正方法
Python で Base64 をデコードする際に最も頻繁に発生するエラーは次のものです:
import base64
base64.b64decode("eyJ0eXBlIjogImFjY2VzcyJ9")
# binascii.Error: Incorrect paddingBase64 は文字列の長さが 4 の倍数である必要があります。 データが URL、HTTP ヘッダー、または JWT ライブラリを経由する場合、 末尾の = パディングはバイトを節約するために削除されます。 修正する信頼できる方法が 2 つあります。
オプション 1:インラインでパディングを復元する(推奨)
import base64
import json
def b64decode_unpadded(data: str | bytes) -> bytes:
"""Decode Base64 with automatic padding correction."""
if isinstance(data, str):
data = data.encode("ascii")
data += b"=" * (-len(data) % 4)
return base64.b64decode(data)
# Works regardless of how many '=' were stripped
token_a = "eyJ0eXBlIjogImFjY2VzcyJ9" # 0 chars of padding stripped
token_b = "eyJ0eXBlIjogInJlZnJlc2gifQ" # 1 char stripped
token_c = "eyJ0eXBlIjogImFwaV9rZXkifQ==" # already padded
for token in (token_a, token_b, token_c):
result = json.loads(b64decode_unpadded(token).decode("utf-8"))
print(result["type"])
# access
# refresh
# api_keyオプション 2:OAuth / JWT 向けの URL セーフデコードとパディング
import base64
import json
def decode_jwt_segment(segment: str) -> dict:
"""Decode a single JWT segment (header or payload)."""
# Add padding, use URL-safe alphabet
padded = segment + "=" * (-len(segment) % 4)
raw = base64.urlsafe_b64decode(padded)
return json.loads(raw.decode("utf-8"))
# Google OAuth ID token payload (simplified)
id_token_payload = (
"eyJzdWIiOiAiMTEwNTY5NDkxMjM0NTY3ODkwMTIiLCAiZW1haWwiOiAic2FyYS5jaGVuQGV4"
"YW1wbGUuY29tIiwgImhkIjogImV4YW1wbGUuY29tIiwgImlhdCI6IDE3NDA5MDAwMDB9"
)
claims = decode_jwt_segment(id_token_payload)
print(claims["email"]) # sara.chen@example.com
print(claims["hd"]) # example.comファイルと API レスポンスから Base64 をデコードする
ディスクから Base64 を読み込むことと API ペイロードをデコードすることは、 最も一般的な本番シナリオの 2 つです。 どちらも適切なエラー処理が必要です——破損したパディングや予期しないバイナリ型は 理論上のエッジケースではなく、実際に発生します。
Base64 ファイルの読み込みとデコード
import base64
import json
from pathlib import Path
def decode_attachment(envelope_path: str, output_path: str) -> None:
"""
Read a JSON envelope with a Base64-encoded attachment,
decode it, and write the binary output to disk.
"""
try:
envelope = json.loads(Path(envelope_path).read_text(encoding="utf-8"))
encoded_data = envelope["attachment"]["data"]
file_bytes = base64.b64decode(encoded_data, validate=True)
Path(output_path).write_bytes(file_bytes)
print(f"Saved {len(file_bytes):,} bytes → {output_path}")
except FileNotFoundError:
print(f"Envelope file not found: {envelope_path}")
except (KeyError, TypeError):
print("Unexpected envelope structure — 'attachment.data' missing")
except base64.binascii.Error as exc:
print(f"Invalid Base64 content: {exc}")
# Example envelope:
# {"attachment": {"filename": "invoice_2026_03.pdf", "data": "JVBERi0xLjQK..."}}
decode_attachment("order_ORD-88472.json", "invoice_2026_03.pdf")HTTP API レスポンスから Base64 をデコードする
import base64
import json
import urllib.request
def fetch_and_decode_secret(vault_url: str, secret_name: str) -> str:
"""
Retrieve a Base64-encoded secret from an internal vault API
and return the decoded plaintext value.
"""
url = f"{vault_url}/v1/secrets/{secret_name}"
req = urllib.request.Request(url, headers={"X-Vault-Token": "s.internal"})
try:
with urllib.request.urlopen(req, timeout=5) as resp:
body = json.loads(resp.read().decode("utf-8"))
# Vault returns: {"data": {"value": "<base64>", "encoding": "base64"}}
encoded = body["data"]["value"]
return base64.b64decode(encoded).decode("utf-8")
except urllib.error.URLError as exc:
raise RuntimeError(f"Vault unreachable: {exc}") from exc
except (KeyError, UnicodeDecodeError, base64.binascii.Error) as exc:
raise ValueError(f"Unexpected secret format: {exc}") from exc
# db_pass = fetch_and_decode_secret("https://vault.internal", "db-prod-password")
# print(db_pass) # s4feP@ss!2026requests ライブラリを使用する場合は、urllib.request を resp = requests.get(url, timeout=5, headers=headers) と body = resp.json() に置き換えてください。Base64 デコードのロジックは同じです。コマンドラインでの Base64 デコード
素早いターミナル検査——トークンの検証、エンコードされた設定の確認、 API 出力をデコーダーにパイプする——には、base64 コマンドが Linux と macOS で使用できます。Python の組み込み -m base64 モジュールは Windows を含むクロスプラットフォームで動作します。
# Decode a Base64 string and print the result (Linux / macOS)
echo "eyJob3N0IjogImRiLXByb2QubXljb21wYW55LmludGVybmFsIn0=" | base64 --decode
# {"host": "db-prod.mycompany.internal"}
# Decode a file, save decoded output
base64 --decode encoded_payload.txt > decoded_output.json
# Python's cross-platform CLI decoder (works on Windows too)
python3 -m base64 -d encoded_payload.txt
# Decode a JWT payload segment inline — strip header/signature first
echo "eyJ1c2VyX2lkIjogMjg5MywgInJvbGUiOiAiYWRtaW4ifQ" | python3 -c "
import sys, base64, json
s = sys.stdin.read().strip()
padded = s + '=' * (-len(s) % 4)
print(json.dumps(json.loads(base64.urlsafe_b64decode(padded)), indent=2))
"シェルパイプラインを書くのが面倒な調査作業には、 文字列をオンライン Base64 Decoder に貼り付ける—— URL セーフ入力を自動検出し、その場でパディングを修正します。
デコード前の Base64 入力バリデーション
Base64 データがユーザー入力、Webhook、または信頼できないサードパーティ API から届く場合、 デコード前にバリデーションを行って、ビジネスロジックの奥深くに紛れ込む binascii.Error トレースバックではなく、明確で対処しやすいエラーを表示してください。 Python では 2 つのアプローチがあります:例外のキャッチ、または正規表現による事前バリデーション。
import base64
import binascii
import re
# ── Option A: try/except (recommended for most code paths) ──────────────────
def safe_b64decode(data: str) -> bytes | None:
"""Return decoded bytes, or None if the input is not valid Base64."""
try:
padded = data + "=" * (-len(data) % 4)
return base64.b64decode(padded, validate=True)
except (binascii.Error, ValueError):
return None
print(safe_b64decode("not-base64!!")) # None
print(safe_b64decode("eyJ0eXBlIjogInJlZnJlc2gifQ")) # b'{"type": "refresh"}'
# ── Option B: regex pre-validation ──────────────────────────────────────────
# Standard Base64 (alphabet: A-Z a-z 0-9 + /)
_STANDARD_RE = re.compile(r"^[A-Za-z0-9+/]*={0,2}$")
# URL-safe Base64 (alphabet: A-Z a-z 0-9 - _)
_URLSAFE_RE = re.compile(r"^[A-Za-z0-9-_]*={0,2}$")
def is_valid_base64(s: str) -> bool:
"""True if s is a syntactically valid standard Base64 string."""
# Length must be a multiple of 4 for fully padded strings
stripped = s.rstrip("=")
padded = stripped + "=" * (-len(stripped) % 4)
return bool(_STANDARD_RE.match(padded))
print(is_valid_base64("SGVsbG8gV29ybGQ=")) # True
print(is_valid_base64("SGVsbG8gV29ybGQ!")) # False (! is not Base64)高性能な代替手段:pybase64
大多数のユースケースでは、Python の標準ライブラリ base64 モジュールで十分です。 1 秒間に数千の API ペイロードを処理したり、タイトなループで数メガバイトのバイナリ添付ファイルをデコードしたり、 プロファイラーが Base64 操作をボトルネックとして示した場合——pybase64 を検討してください。 これは libbase64 の C 拡張ラッパーで、大きな入力では通常標準ライブラリの実装より 2〜5 倍高速です。
pip install pybase64
import pybase64
# Drop-in replacement — identical API to the stdlib base64 module
encoded_image = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQI12NgAAIABQ..."
image_bytes = pybase64.b64decode(encoded_image, validate=False)
print(f"Decoded {len(image_bytes):,} bytes")
# URL-safe variant — same as base64.urlsafe_b64decode()
token_bytes = pybase64.urlsafe_b64decode("eyJpZCI6IDQ3MX0=")
print(token_bytes) # b'{"id": 471}'
# Benchmark note: on strings under ~10 KB the function-call overhead dominates
# and the speedup is negligible. Profile before switching.API は base64 と意図的に同一です——インポートを入れ替えるだけで他は何も変わりません。 プロファイリングで Base64 が実際にボトルネックであることが確認された場合にのみ使用してください。 高スループットのデータパイプライン以外ではまれな状況です。
よくあるミス
これら 4 つのエラーをコードレビューで繰り返し見てきました—— Base64 デコードが文字列を直接返す JavaScript や PHP などの言語から来た開発者や、 エラー処理を完全にスキップするチュートリアルから来た開発者に特に多く見られます。
ミス 1:結果に .decode() を呼び出し忘れる
# ❌ b64decode() returns bytes — this crashes downstream
import base64
raw = base64.b64decode("eyJ1c2VyX2lkIjogNDcxLCAicm9sZSI6ICJhZG1pbiJ9")
# TypeError: byte indices must be integers or slices, not str
user_id = raw["user_id"]# ✅ decode bytes → str, then parse
import base64, json
raw = base64.b64decode("eyJ1c2VyX2lkIjogNDcxLCAicm9sZSI6ICJhZG1pbiJ9")
payload = json.loads(raw.decode("utf-8"))
print(payload["user_id"]) # 471
print(payload["role"]) # adminミス 2:URL セーフな Base64 入力に b64decode() を使用する
# ❌ JWT and OAuth tokens use '-' and '_' — not in standard alphabet import base64 jwt_segment = "eyJ1c2VyX2lkIjogMjg5M30" # binascii.Error or silently wrong bytes — unpredictable behaviour base64.b64decode(jwt_segment)
# ✅ use urlsafe_b64decode() for any token with '-' or '_'
import base64, json
jwt_segment = "eyJ1c2VyX2lkIjogMjg5M30"
padded = jwt_segment + "=" * (-len(jwt_segment) % 4)
data = base64.urlsafe_b64decode(padded)
print(json.loads(data.decode("utf-8")))
# {'user_id': 2893}ミス 3:削除されたトークンのパディングを修正しない
# ❌ JWTs and most URL-transmitted tokens strip '=' — this crashes import base64 # Valid JWT payload segment — no padding, as per spec segment = "eyJ0eXBlIjogImFjY2VzcyIsICJqdGkiOiAiMzgxIn0" base64.urlsafe_b64decode(segment) # binascii.Error: Incorrect padding
# ✅ add padding before every urlsafe_b64decode() call
import base64, json
segment = "eyJ0eXBlIjogImFjY2VzcyIsICJqdGkiOiAiMzgxIn0"
padded = segment + "=" * (-len(segment) % 4)
result = json.loads(base64.urlsafe_b64decode(padded).decode("utf-8"))
print(result["type"]) # access
print(result["jti"]) # 381ミス 4:バイナリデータに .decode("utf-8") を呼び出す
# ❌ Binary files (PDF, PNG, ZIP) are not UTF-8 text — this crashes
import base64
# Base64-encoded PDF starts with JVBERi... (%PDF-)
pdf_b64 = "JVBERi0xLjQKJeLjz9MKNyAwIG9iago8PC9U..."
pdf_text = base64.b64decode(pdf_b64).decode("utf-8")
# UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe2# ✅ write binary directly to a file — no .decode() needed
import base64
from pathlib import Path
pdf_b64 = "JVBERi0xLjQKJeLjz9MKNyAwIG9iago8PC9U..."
pdf_bytes = base64.b64decode(pdf_b64)
Path("report_q1_2026.pdf").write_bytes(pdf_bytes)
print(f"Saved {len(pdf_bytes):,} bytes")Python で大きな Base64 ファイルをデコードする
Path.read_text() で 200 MB の Base64 ファイルを読み込み、一度にデコードすると、 エンコードされた文字列、デコードされたバイト、および中間表現が同時にメモリに確保され—— 制約のあるサーバーや Lambda 関数ではメモリが簡単に不足します。 約 50〜100 MB を超えるファイルには、チャンク処理アプローチを使用してください。
ディスクへのチャンクデコード(ファイル全体を RAM に読み込まない)
import base64
def decode_large_b64_file(input_path: str, output_path: str, chunk_size: int = 65536) -> None:
"""
Decode a large Base64 file in chunks to avoid loading the entire encoded
string into memory. chunk_size must be a multiple of 4 to keep Base64
block boundaries aligned across reads.
"""
assert chunk_size % 4 == 0, "chunk_size must be a multiple of 4"
bytes_written = 0
with open(input_path, "rb") as src, open(output_path, "wb") as dst:
while True:
chunk = src.read(chunk_size)
if not chunk:
break
# Strip whitespace that may appear in wrapped/multiline Base64
chunk = chunk.strip()
if chunk:
dst.write(base64.b64decode(chunk))
bytes_written += len(chunk)
print(f"Decoded {bytes_written:,} Base64 bytes → {output_path}")
# Example: decode a 300 MB database snapshot stored as Base64
decode_large_b64_file("snapshot_2026_03_13.b64", "snapshot_2026_03_13.sql.gz")PEM / 複数行データに対する base64.decodebytes() でのデコード
import base64
# base64.decodebytes() is designed for MIME / PEM Base64 that wraps at 76 chars.
# It silently ignores whitespace and newlines — perfect for certificate files.
with open("server_cert.pem", "rb") as f:
pem_data = f.read()
# Strip PEM headers if present, then decode
lines = [
line for line in pem_data.splitlines()
if not line.startswith(b"-----")
]
raw_cert = base64.decodebytes(b"
".join(lines))
print(f"Certificate DER payload: {len(raw_cert):,} bytes")base64.decodebytes() を使用してください。 大きな不透明な BLOB(バックアップ、メディアファイル)には上記のチャンクアプローチを使用してください。 コンパクトな単一行トークン(JWT、OAuth)には、 b64decode() または urlsafe_b64decode() が常に正しい選択です。Python Base64 デコードメソッド——クイック比較
| メソッド | アルファベット | パディング | 出力 | インストール要否 | 最適な用途 |
|---|---|---|---|---|---|
| base64.b64decode() | 標準 (A–Z a–z 0–9 +/) | 必須 | bytes | 不要(標準ライブラリ) | 汎用、メール、PEM |
| base64.decodebytes() | 標準 (A–Z a–z 0–9 +/) | 無視(空白を除去) | bytes | 不要(標準ライブラリ) | PEM 証明書、MIME 添付、複数行 Base64 |
| base64.urlsafe_b64decode() | URL セーフ (A–Z a–z 0–9 -_) | 必須 | bytes | 不要(標準ライブラリ) | JWT、OAuth、Google Cloud API |
| base64.b32decode() | 32 文字 (A–Z, 2–7) | 必須 | bytes | 不要(標準ライブラリ) | TOTP シークレット、DNS セーフ ID |
| base64.b16decode() | 16 進数 (0–9, A–F) | なし | bytes | 不要(標準ライブラリ) | 16 進数エンコードのチェックサム、ハッシュ |
| pybase64.b64decode() | 標準 (A–Z a–z 0–9 +/) | 必須 | bytes | 要(pip) | 高スループットパイプライン、大きなペイロード |
| CLI: base64 --decode | 標準 | 自動 | stdout | 不要(システム) | 素早いターミナル確認 |
デフォルトは b64decode() を使用してください。入力に - または _ が見えたら すぐに urlsafe_b64decode() に切り替えてください——これらの文字は URL セーフな Base64 の明確な証です。 プロファイリングでボトルネックが確認された場合にのみ pybase64 を使用してください。 開発中のワンオフチェックには、 ToolDeck の Base64 Decoder が 両方のアルファベットに対応し、パディングを自動修正します——Python 環境は不要です。
よくある質問
Python で Base64 文字列を通常の文字列にデコードするには?
base64.b64decode(encoded) を呼び出して bytes を取得し、 その結果に .decode("utf-8") を呼び出して Python str を取得します。b64decode() は Base64 アルファベットを逆変換するだけで——元のコンテンツが UTF-8、Latin-1、またはバイナリであるかを知りません。 データが非 UTF-8 エンコーディングを使用している場合は、正しいコーデック名を.decode() に渡してください(例:.decode("latin-1"))。
Python で Base64 をデコードする際に "Incorrect padding" が発生するのはなぜ?
Base64 文字列の長さは 4 の倍数でなければなりません。JWT、OAuth トークン、 URL で送信されたデータは末尾の = パディングが削除されることがよくあります。 デコード前に "=" * (-len(s) % 4) を追加して修正してください。 この式は必要に応じて正確に 0、1、または 2 文字を追加し、 文字列がすでに正しくパディングされている場合は安全な no-op です。
Python の b64decode() と urlsafe_b64decode() の違いは何ですか?
どちらも同じ Base64 アルゴリズムをデコードしますが、62 番目と 63 番目の文字に異なるアルファベットを使用します。b64decode() は + と / を使用し、 urlsafe_b64decode() は - と _ を使用します。 URL セーフバリアントは RFC 4648 §5 で定義されており、Base64 が URL、HTTP ヘッダー、 または Cookie 値でパーセントエンコードなしに動作する必要がある場合に使用されます。 混同すると binascii.Error または静かな出力の破損が発生します。
Python で Base64 エンコードされた画像をデコードするには?
base64.b64decode(encoded) で bytes にデコードし、 それらの bytes を直接ファイルに書き込んでください——画像データに .decode("utf-8") を 呼び出してはいけません。 入力がデータ URL(例:data:image/png;base64,iVBORw0KGgo…)の場合は、 先にプレフィックスを取り除いてください:
import base64
from pathlib import Path
# Data URL from an <img src="..."> or an API response
data_url = (
"data:image/png;base64,"
"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQI12NgAAIABQ=="
)
# Split off the "data:image/png;base64," prefix
_, encoded = data_url.split(",", 1)
image_bytes = base64.b64decode(encoded)
Path("avatar_jsmith.png").write_bytes(image_bytes)
print(f"Saved {len(image_bytes)} bytes")Python でモジュールをインポートせずに Base64 をデコードできますか?
技術的には可能ですが、その理由はありません。base64 モジュールは Python の標準ライブラリの一部であり、常に利用可能で常にインストールされています—— 依存関係がなく、関数は C で実装されています。Base64 をゼロから再実装するのは 遅く、エラーが起きやすく、メンテナンスも難しくなります。常に import base64 を使用してください。
入力が文字列ではなく bytes の場合、Python で Base64 をデコードするには?
base64.b64decode() は str、bytes、 bytearray を互換的に受け入れます——変換は不要です。 ソケットやファイル読み込みから b"SGVsbG8=" を受け取った場合、 そのまま渡してください。パディング修正は bytes モードでも同様に機能します: data + b"=" * (-len(data) % 4)。
関連ツール
- Base64 Encode — テキストやバイナリファイルを即座に Base64 にエンコード。スクリプトを実行せずに Python デコードコードのテストデータを生成するのに便利です。
- JWT Decoder — コードを書かずに JWT ヘッダーとペイロードを検査。ペイロードは上記の例と同様に URL セーフな Base64 でデコードされます。
- URL Decode — クエリ文字列やパスセグメントをパーセントデコード。OAuth コールバック URL や Webhook ペイロードの解析時に Base64 デコードと組み合わせて必要になることがよくあります。
- URL Encode — 特殊文字をパーセントエンコード。Base64 エンコードされた値を URL クエリパラメーターに安全に埋め込む場合に便利です。