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という選択肢もある

あわせて読みたい

プログラミング学習に興味がある方は、まずは無料体験会へ

無料体験会・お申し込みはこちら