Python base64とは?バイナリを文字列に変換する方法を解説
Pythonのbase64は、バイナリデータを文字列に変換するモジュールです。
画像やファイルをテキストしか扱えない場所——JSON・メール・URLなど——に埋め込むときに使います。
Base64とは何か
import base64
r = base64.b64encode(b"hello")
print(r, "型:", type(r).__name__)
print("str化:", r.decode())
実行結果:
b'aGVsbG8=' 型: bytes
str化: aGVsbG8=
Base64は64種類の文字だけでデータを表現する方式です。使うのは次の文字です。
| 種類 | 文字 |
|---|---|
| 英大文字 | A〜Z(26種) |
| 英小文字 | a〜z(26種) |
| 数字 | 0〜9(10種) |
| 記号 | +と/(2種) |
| パディング | = |
合計64種類なので「Base64」です。どんなバイト列もこの64文字だけで表せます。
なぜ必要なのか
世の中にはテキストしか通せない場所が数多くあります。
| 場所 | 問題 |
|---|---|
| JSON | バイト列を直接入れられない |
| メール(SMTP) | 元は7ビット文字しか想定していない |
| URL | 使える文字が限られる |
| HTMLの属性 | 改行や引用符が壊れる |
| 設定ファイル | バイナリを書けない |
そのまま入れると改行コードや制御文字が化けて壊れます。Base64にすれば安全な文字だけになるため、どこを通しても元通りに復元できます。
Base64は暗号ではない
最も重要な注意点です。
import base64
secret = base64.b64encode(b"password123").decode()
print("エンコード:", secret)
print("誰でも戻せる:", base64.b64decode(secret).decode())
実行結果:
エンコード: cGFzc3dvcmQxMjM=
誰でも戻せる: password123
見た目は意味不明ですが、鍵もパスワードも不要で誰でも復元できます。オンラインの変換ツールに貼るだけで中身が読めます。
パスワード・APIキー・個人情報をBase64で「隠した」つもりにならないでください。秘密にしたいなら暗号化が必要です。
Base64の目的は「安全に運ぶこと」であって「隠すこと」ではありません。
サイズが約1.33倍になる
import base64
data = b"x" * 300
enc = base64.b64encode(data)
print(len(data), "→", len(enc), f"({len(enc) / len(data):.2f}倍)")
実行結果:
300 → 400 (1.33倍)
3バイトを4文字で表すため、必ず4/3倍に増えます。
大きな画像をBase64でHTMLに埋め込むと、ファイルサイズが33%増えるということです。小さなアイコンなら通信回数が減る利点が上回りますが、大きな画像は通常どおりファイルとして配信してください。
base64モジュールの主な関数
| 関数 | 用途 | 解説記事 |
|---|---|---|
b64encode() |
バイト列 → Base64 | b64encode |
b64decode() |
Base64 → バイト列 | b64decode |
urlsafe_b64encode() |
URL用(-と_を使う) |
urlsafe |
urlsafe_b64decode() |
同上の復元 | |
b32encode()/b16encode() |
32文字・16文字で表現 | 下記参照 |
b32・b16との違い
import base64
print("b64:", base64.b64encode(b"hello").decode())
print("b32:", base64.b32encode(b"hello").decode())
print("b16:", base64.b16encode(b"hello").decode())
print("b16はただの16進:", b"hello".hex().upper())
実行結果:
b64: aGVsbG8=
b32: NBSWY3DP
b16: 68656C6C6F
b16はただの16進: 68656C6C6F
| 方式 | サイズ | 特徴 |
|---|---|---|
| Base64 | 1.33倍 | 最も効率がよい。標準 |
| Base32 | 1.6倍 | 大文字と数字のみ。誤読が少ない |
| Base16 | 2倍 | 16進数そのもの |
Base32は大文字と数字だけなので、人が読み上げたり手で入力したりする場面で使われます(二段階認証の秘密鍵など)。
実践例|画像をJSONで送る
import base64, json
from pathlib import Path
def to_json(path):
data = Path(path).read_bytes()
return json.dumps({
"name": Path(path).name,
"content": base64.b64encode(data).decode(),
})
def from_json(s, out_path):
d = json.loads(s)
Path(out_path).write_bytes(base64.b64decode(d["content"]))
.decode()を忘れるとTypeErrorでJSONにできません。b64encode()が返すのはbytesだからです。
この「bytesとstrの行き来」がbase64で最もつまずく部分です。詳しくは「Python base64.b64encode()とは?バイナリを文字列に変換する方法」で解説しています。
base64モジュールのまとめ
- Base64はバイナリを64種類の文字で表す方式
- テキストしか通らない場所(JSON・メール・URL)で使う
- 暗号ではない——誰でも復元できる
- サイズは約1.33倍に増える
- URLに入れるなら
urlsafe_b64encode() - 人が読むならBase32という選択肢もある






