Base64 kódování v Pythonu – Kompletní průvodce
Používejte bezplatný Base64 Encode Online přímo v prohlížeči — bez instalace.
Vyzkoušet Base64 Encode Online online →Když vytváříš Python služby, které předávají přihlašovací údaje v HTTP Basic Auth hlavičkách, vkládají binární prostředky do odpovědí API nebo ukládají TLS certifikáty do proměnných prostředí, pravidelně píšeš base64 encode Python kód. Python dodává modul base64 ve standardní knihovně — bez nutnosti pip install — ale rozlišení mezi bytes a string a rozdíl mezi b64encode, urlsafe_b64encode a encodebytes mate vývojáře častěji, než by se dalo čekat. Pro rychlé kódování bez psaní kódu to ToolDeck's Base64 Encoder vyřeší okamžitě v prohlížeči. Tato příručka pokrývá celé stdlib API, URL-bezpečné kódování pro JWT, scénáře se soubory a odpověďmi API, zkratky CLI, výkonnou alternativu a čtyři chyby, které při revizích kódu vídám nejčastěji.
- ✓base64.b64encode() očekává bytes, nikoli str — vždy zavolej .encode("utf-8") na vstupním řetězci před jeho předáním
- ✓Návratová hodnota je také bytes — zavolej .decode("utf-8") nebo .decode("ascii") pro získání obyčejného str, který lze vložit do JSON nebo HTTP hlaviček
- ✓base64.urlsafe_b64encode() nahrazuje + → - a / → _, ale ponechává =-výplň — odstraň ji ručně pomocí .rstrip("=") pro JWT segmenty
- ✓base64.encodebytes() vkládá \n každých 76 znaků (formát MIME) — nikdy ho nepoužívej pro data URI, JSON pole nebo proměnné prostředí
- ✓pybase64 (rozšíření C, drop-in API) kóduje 2–10× rychleji než stdlib; vyplatí se pro vysoce výkonné služby zpracovávající velké datové části
Co je kódování Base64?
Base64 převádí libovolná binární data na řetězec sestavený z 64 tisknutelných ASCII znaků: A–Z, a–z, 0–9, + a /. Každé 3 vstupní bajty se mapují přesně na 4 znaky Base64. Pokud délka vstupu není násobkem 3, přidají se jeden nebo dva = výplňové znaky. Zakódovaný výstup je vždy přibližně o 33 % větší než originál.
Base64 není šifrování — neposkytuje žádnou důvěrnost. Jeho účelem je bezpečnost přenosu: mnoho protokolů a úložných systémů bylo navrženo pro 7-bitový ASCII text a nedokáže bezpečně přenášet libovolné binární bajty. Base64 překlenuje tuto mezeru. Běžné Python případy použití zahrnují HTTP Basic Auth hlavičky, data URI pro vkládání obrázků do HTML nebo CSS, segmenty JWT tokenů, e-mailové přílohy MIME a předávání binárních blobů přes proměnné prostředí nebo JSON API.
deploy-svc:sk-prod-9f2a1c3e8b4d
ZGVwbG95LXN2Yzpzay1wcm9kLTlmMmExYzNlOGI0ZA==
base64.b64encode() — Standardní kódování: průvodce s příklady
base64.b64encode(s, altchars=None) je primární kódovací funkcí v Pythonově stdlib. Nachází se v modulu base64, který je součástí každé instalace Pythonu. Funkce přijímá objekt bytes a vrací objekt bytes obsahující ASCII Base64 reprezentaci. V celé této příručce se předpokládá Python 3.x (3.6+).
Minimální funkční příklad
import base64
# Kódování přihlašovacích údajů API pro HTTP Basic Auth hlavičku
service_id = "deploy-svc"
api_key = "sk-prod-9f2a1c3e8b4d"
credential_bytes = f"{service_id}:{api_key}".encode("utf-8")
encoded_bytes = base64.b64encode(credential_bytes)
encoded_str = encoded_bytes.decode("ascii") # bytes → str
print(encoded_str)
# ZGVwbG95LXN2Yzpzay1wcm9kLTlmMmExYzNlOGI0ZA==
import urllib.request
req = urllib.request.Request("https://api.internal/v1/deployments")
req.add_header("Authorization", f"Basic {encoded_str}")
# Hodnota hlavičky: Basic ZGVwbG95LXN2Yzpzay1wcm9kLTlmMmExYzNlOGI0ZA==Rozšířený příklad — sort_keys, vnořené objekty, dekódování zpět
import base64
import json
# Kódování strukturované konfigurace serveru pro proměnnou prostředí
server_config = {
"host": "db-primary.eu-west-1.internal",
"port": 5432,
"database": "analytics_prod",
"max_connections": 150,
"ssl": {
"mode": "verify-full",
"cert_path": "/etc/ssl/certs/db-client.crt",
"reject_self_signed": True,
},
}
config_json = json.dumps(server_config, sort_keys=True)
encoded_bytes = base64.b64encode(config_json.encode("utf-8"))
encoded_str = encoded_bytes.decode("ascii")
print(encoded_str[:60] + "...")
# eyJkYXRhYmFzZSI6ICJhbmFseXRpY3NfcHJvZCIsICJob3N0IjogImRi...
# Dekódovat a ověřit zpátky
decoded_json = base64.b64decode(encoded_str).decode("utf-8")
restored = json.loads(decoded_json)
print(restored["host"]) # db-primary.eu-west-1.internal
print(restored["ssl"]["mode"]) # verify-fullb64decode() je ve výchozím nastavení tolerantní — tiše ignoruje neplatné znaky včetně mezer a odřádkování. Předej validate=True, aby se při výskytu znaku mimo Base64 vyvolala výjimka binascii.Error. Používej to při dekódování nedůvěryhodného vstupu z externích systémů.Kódování non-ASCII a Unicode řetězců v Pythonu
Řetězce v Pythonu 3 jsou standardně Unicode. Modul base64 pracuje s bytes, nikoli s str — musíš tedy řetězec nejprve zakódovat na bajty, než ho předáš. Na výběru kódování záleží: UTF-8 zvládne každý Unicode kódový bod a je správnou volbou pro téměř všechny případy použití.
import base64
# Kódování vícejazyčného obsahu — zobrazovaná jména z mezinárodní platformy
user_names = [
"Tomáš Novák", # České — rozšířená latinka
"田中太郎", # CJK ideogramy — 3 bajty na znak v UTF-8
"Мария Соколова", # Cyrilice — U+041C a výše
"Jana Horáková", # České — rozšířená latinka
]
for name in user_names:
encoded = base64.b64encode(name.encode("utf-8")).decode("ascii")
decoded = base64.b64decode(encoded).decode("utf-8")
print(f"Originál : {name}")
print(f"Zakódováno: {encoded}")
print(f"Zpět : {decoded}")
print(f"Shoda : {name == decoded}")
print()
# Originál : Мария Соколова
# Zakódováno: 0JzQsNGA0LjRjyDQodC+0LrQvtC70L7QstCw
# Zpět : Мария Соколова
# Shoda : TrueModul base64 — Reference funkcí
Modul base64 zpřístupňuje několik kódovacích funkcí. Zde je kompletní reference pro ty, se kterými se v praxi setkáš:
| Funkce | Vstup | Vrací | Popis |
|---|---|---|---|
| b64encode(s, altchars=None) | bytes | bytes | Standardní Base64 (RFC 4648 §4). altchars nahradí znaky + a / dvěma vlastními bajty. |
| b64decode(s, altchars=None, validate=False) | bytes | str | bytes | Dekóduje standardní Base64. validate=True vyvolá binascii.Error při neplatných vstupních znacích. |
| urlsafe_b64encode(s) | bytes | bytes | URL-bezpečný Base64 (RFC 4648 §5). Používá - a _ místo + a /. Ponechává =-výplň. |
| urlsafe_b64decode(s) | bytes | str | bytes | Dekóduje URL-bezpečný Base64. Přijímá vstup s výplní i bez ní. |
| encodebytes(s) | bytes | bytes | MIME Base64: vkládá \n každých 76 znaků a přidává závěrečné \n. Pouze pro e-mail/MIME. |
| decodebytes(s) | bytes | bytes | Dekóduje MIME Base64. Ignoruje mezery a vložená odřádkování. |
| b16encode(s) | bytes | bytes | Hexadecimální kódování (Base16). Každý bajt se stane dvěma hex znaky velkými písmeny. Bez výplně. |
| b32encode(s) | bytes | bytes | Kódování Base32. Používá A–Z a 2–7. Větší výstup než Base64; používá se v TOTP tajemstvích. |
Parametr altchars v b64encode přijímá 2-bajtový objekt, který nahradí znaky + a /. Předání altchars=b'-_' vytvoří výstup identický s urlsafe_b64encode, ale umožní ti ovládat výplň odděleně.
URL-bezpečný Base64 — urlsafe_b64encode() pro JWT a parametry dotazu
Standardní Base64 používá + a /, oba jsou vyhrazené znaky v URL. Znak + v řetězci dotazu se dekóduje jako mezera a / je oddělovač cesty. Když se zakódovaná hodnota objeví v URL, názvu souboru nebo cookie, potřebuješ URL-bezpečnou variantu: urlsafe_b64encode() nahrazuje - za + a _ za /.
JWT používají URL-bezpečný Base64 bez výplně pro všechny tři segmenty (záhlaví, datová část, podpis). Výplň je nutné odstranit ručně — Pythonova stdlib ji ponechává.
Kódování segmentu datové části JWT
import base64
import json
def encode_jwt_segment(data: dict) -> str:
"""Zakóduje dict jako URL-bezpečný Base64 řetězec bez výplně (formát JWT)."""
json_bytes = json.dumps(data, separators=(",", ":")).encode("utf-8")
return base64.urlsafe_b64encode(json_bytes).rstrip(b"=").decode("ascii")
def decode_jwt_segment(segment: str) -> dict:
"""Dekóduje URL-bezpečný Base64 JWT segment (zvládá chybějící výplň)."""
# Přidání výplně zpět: Base64 vyžaduje délku jako násobek 4
padding = 4 - len(segment) % 4
padded = segment + ("=" * (padding % 4))
raw = base64.urlsafe_b64decode(padded)
return json.loads(raw)
# Sestavení JWT záhlaví a datové části
header = {"alg": "HS256", "typ": "JWT"}
payload = {
"sub": "usr_7c3a9f1b2d",
"workspace": "ws_eu-west-1-prod",
"role": "data-engineer",
"iat": 1741824000,
"exp": 1741910400,
}
header_segment = encode_jwt_segment(header)
payload_segment = encode_jwt_segment(payload)
print(header_segment)
# eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
print(payload_segment)
# eyJzdWIiOiJ1c3JfN2MzYTlmMWIyZCIsIndvcmtzcGFjZSI6IndzX2...
# Ověření dekódování zpět
restored = decode_jwt_segment(payload_segment)
print(restored["role"]) # data-engineerurlsafe_b64decode() od Pythonu 3.x přijímá vstup s výplní i bez ní, ale pouze pokud jsou znaky URL-bezpečné (- a _). Nikdy nepředávej standardní Base64 řetězec (s + nebo /) do urlsafe_b64decode — neshodující se znaky způsobí tiché poškození dat nebo výjimku binascii.Error.Kódování souborů a odpovědí API v Pythonu
V produkčním kódu se kódování Base64 nejčastěji objevuje u souborů přenášených po síti a u odpovědí z externích API dodávajících binární obsah. Oba scénáře vyžadují pečlivé zacházení s hranicí bytes.
Čtení souboru z disku a jeho zakódování
import base64
import json
from pathlib import Path
def encode_file_to_base64(file_path: str) -> str:
"""Přečte binární soubor a vrátí jeho Base64 zakódovanou reprezentaci."""
try:
raw_bytes = Path(file_path).read_bytes()
return base64.b64encode(raw_bytes).decode("ascii")
except FileNotFoundError:
raise FileNotFoundError(f"Soubor nenalezen: {file_path}")
except PermissionError:
raise PermissionError(f"Přístup odepřen při čtení: {file_path}")
# Připojení TLS certifikátu k manifestu nasazení
cert_b64 = encode_file_to_base64("./ssl/service-client.crt")
deployment_manifest = {
"service": "payment-processor",
"environment": "production",
"region": "eu-west-1",
"tls": {
"client_cert": cert_b64,
"cert_format": "base64-pem",
},
}
# Zápis manifestu — certifikát je bezpečně vložen jako řetězec
with open("./dist/deployment-manifest.json", "w") as f:
json.dump(deployment_manifest, f, indent=2)
print(f"Certifikát zakódován: {len(cert_b64)} znaků")Kódování HTTP API odpovědi pro ladění
import base64
import requests # pip install requests
def fetch_and_encode_binary(url: str, headers: dict | None = None) -> str:
"""Načte binární zdroj z API a vrátí ho jako Base64."""
response = requests.get(url, headers=headers or {}, timeout=10)
response.raise_for_status() # vyvolá HTTPError pro 4xx/5xx
content_type = response.headers.get("Content-Type", "unknown")
encoded = base64.b64encode(response.content).decode("ascii")
print(f"Content-Type : {content_type}")
print(f"Surová velikost : {len(response.content):,} bajtů")
print(f"Zakódovaná vel. : {len(encoded):,} znaků")
return encoded
# Příklad: stažení podepsané PDF faktury z interního fakturačního API
invoice_b64 = fetch_and_encode_binary(
"https://billing.internal/api/v2/invoices/INV-2026-0042/pdf",
headers={"Authorization": "Bearer eyJhbGc..."},
)
# Připojení k datové části oznámení
notification = {
"recipient_id": "team-finance",
"invoice_id": "INV-2026-0042",
"attachment": {
"filename": "invoice-2026-0042.pdf",
"content": invoice_b64,
"content_type": "application/pdf",
"encoding": "base64",
},
}
print(f"Datová část připravena: {len(str(notification)):,} znaků")Jak Base64 zakódovat obrázek v Pythonu
Zakódování obrázku do Base64 a jeho vložení jako data URI je standardní přístup pro HTML e-mailové šablony, generování PDF a samostatné HTML snímky. Prohlížeč interpretuje zakódovaný řetězec přímo — není potřeba žádný samostatný požadavek na obrázek. Stejný vzor funguje pro jakýkoli binární typ souboru: PNG, JPEG, SVG, WebP nebo PDF.
import base64
import mimetypes
from pathlib import Path
def image_to_data_uri(image_path: str) -> str:
"""Převede soubor obrázku na Base64 data URI pro inline vložení do HTML."""
path = Path(image_path)
mime_type = mimetypes.guess_type(image_path)[0] or "image/octet-stream"
raw_bytes = path.read_bytes()
encoded = base64.b64encode(raw_bytes).decode("ascii")
return f"data:{mime_type};base64,{encoded}"
# Vložení produktových obrázků inline do HTML e-mailové šablony
hero_uri = image_to_data_uri("./assets/product-hero-768px.png")
thumbnail_uri = image_to_data_uri("./assets/product-thumb-128px.webp")
html_fragment = f"""
<img src="{hero_uri}"
alt="Produktový obrázek"
width="768" height="432"
style="display:block;max-width:100%" />
"""
print(f"PNG data URI začíná: {hero_uri[:60]}...")
# data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAwAAAAA...data:image/svg+xml,{encoded}) často menší než Base64, protože SVG je textový formát a Base64 zvyšuje velikost o ~33 %. Pro rastrové formáty (PNG, JPEG, WebP) používej Base64 a pro SVG URL kódování.Práce s velkými soubory — Blokové kódování Base64
Načtení celého souboru do paměti pomocí Path.read_bytes() je v pořádku pro soubory do ~50 MB. Nad touto hranicí se špičková spotřeba paměti stává výraznou — soubor 200 MB vyžaduje ~200 MB pro surové bajty plus ~267 MB pro výstup Base64, celkem ~467 MB v jednom procesu. Pro velké soubory čti a kóduj po blocích.
Kritické omezení: velikost bloku musí být násobkem 3 bajtů. Base64 kóduje 3 vstupní bajty na přesně 4 výstupní znaky. Pokud hranice bloku padne na nenásobek 3, přidá kodér = výplň uprostřed proudu, čímž zneplatní zřetězený výstup.
Streamovací kódování do souboru (bez načtení celého souboru do paměti)
import base64
from pathlib import Path
CHUNK_SIZE = 3 * 1024 * 256 # 786 432 bajtů — násobek 3, ~768 KB na blok
def encode_large_file(input_path: str, output_path: str) -> int:
"""
Zakóduje velký binární soubor do Base64 bez jeho úplného načtení do paměti.
Vrací počet zapsaných znaků Base64.
"""
total_chars = 0
with open(input_path, "rb") as src, open(output_path, "w") as dst:
while True:
chunk = src.read(CHUNK_SIZE)
if not chunk:
break
encoded_chunk = base64.b64encode(chunk).decode("ascii")
dst.write(encoded_chunk)
total_chars += len(encoded_chunk)
return total_chars
# Zakódování produktového videa 300 MB pro manifest doručení prostředků
chars_written = encode_large_file(
"./uploads/product-demo-4k.mp4",
"./dist/product-demo-4k.b64",
)
print(f"Zakódováno: {chars_written:,} znaků Base64")
# Zakódováno: 407 374 184 znaků Base64Kódování adresáře binárních prostředků (výstup NDJSON)
import base64
import json
from pathlib import Path
def encode_assets_to_ndjson(asset_dir: str, output_path: str) -> int:
"""
Zakóduje všechny binární soubory v adresáři do NDJSON manifestu.
Každý řádek je JSON objekt: {"path": "...", "mime": "...", "data": "<base64>"}
Vrací počet zpracovaných souborů.
"""
import mimetypes
asset_path = Path(asset_dir)
count = 0
with open(output_path, "w") as out:
for file_path in sorted(asset_path.rglob("*")):
if not file_path.is_file():
continue
mime = mimetypes.guess_type(str(file_path))[0] or "application/octet-stream"
encoded = base64.b64encode(file_path.read_bytes()).decode("ascii")
record = {"path": str(file_path.relative_to(asset_path)), "mime": mime, "data": encoded}
out.write(json.dumps(record) + "\n")
count += 1
return count
processed = encode_assets_to_ndjson("./dist/static/", "./dist/asset-bundle.ndjson")
print(f"Zakódováno {processed} souborů do NDJSON balíčku prostředků")read_bytes() na blokové čtení, když vstupní soubor přesáhne ~50–100 MB, nebo když tvoje služba zpracovává mnoho souborů současně a tlak na paměť se stává problémem. Pro soubory pod 50 MB je jednodušší b64encode(path.read_bytes()).decode() jednořádkový zápis rychlejší a snáze pochopitelný.Kódování Base64 z příkazové řádky pomocí Pythonu
Python dodává rozhraní CLI pro modul base64 — nejsou potřeba žádné další nástroje. Funguje multiplatformně, což je užitečné v CI pipeline a prostředích Windows, kde systémový příkaz base64 nemusí být dostupný.
# ── python -m base64 ─────────────────────────────────────────────────── # Zakódování řetězce (přesměrování ze stdin) echo -n "deploy-svc:sk-prod-9f2a1c3e8b4d" | python3 -m base64 # ZGVwbG95LXN2Yzpzay1wcm9kLTlmMmExYzNlOGI0ZA== # Zakódování souboru python3 -m base64 ./ssl/service-client.crt # Dekódování řetězce Base64 echo "ZGVwbG95LXN2Yzpzay1wcm9kLTlmMmExYzNlOGI0ZA==" | python3 -m base64 -d # Dekódování souboru Base64 zpět na binární python3 -m base64 -d ./dist/service-client.b64 > ./restored.crt # ── Python jednořádkový zápis — multiplatformní, funguje na Windows ─── # Zakódování řetězce python3 -c "import base64,sys; print(base64.b64encode(sys.argv[1].encode()).decode())" "my-secret" # bXktc2VjcmV0 # URL-bezpečné kódování (bez výplně) python3 -c "import base64,sys; print(base64.urlsafe_b64encode(sys.argv[1].encode()).rstrip(b'=').decode())" "my-secret" # bXktc2VjcmV0 # Zakódování souboru inline (výsledek na stdout) python3 -c "import base64,sys; print(base64.b64encode(open(sys.argv[1],'rb').read()).decode())" ./config.json
base64 na macOS python -m base64 ve výchozím nastavení nezalamuje výstup na 76 znacích. Výstup je jeden nepřerušený řádek, což je žádoucí pro proměnné prostředí, JSON pole a HTTP hlavičky. Používej ho jako náhradu za systémový base64 na jakémkoli operačním systému.Vysoce výkonná alternativa: pybase64
Modul base64 ze stdlib Pythonu je implementován v čistém Pythonu (s tenkou vrstvou C v CPythonu). Pro služby, které kódují velké datové části s vysokou propustností — pipeline zpracování obrazu, hromadné exportní úlohy, příjem telemetrie v reálném čase — pybase64 je drop-in náhrada podpořená libbase64, C knihovnou akcelerovanou SIMD. Benchmarky ukazují 2–10× zlepšení propustnosti v závislosti na velikosti datové části a architektuře CPU.
pip install pybase64
import pybase64
import time
# pybase64 je drop-in náhrada — stejné signatury funkcí jako stdlib
sample_payload = b"x" * (1024 * 1024) # 1 MB binárních dat
# Standardní kódování — identický výstup jako base64.b64encode()
encoded = pybase64.b64encode(sample_payload)
decoded = pybase64.b64decode(encoded)
assert decoded == sample_payload
# URL-bezpečné kódování — identický výstup jako base64.urlsafe_b64encode()
url_safe = pybase64.urlsafe_b64encode(sample_payload)
# b64encode_as_string() vrací str přímo — není potřeba volat .decode()
telemetry_event = b'{"event":"page_view","session_id":"sess_3a7f91c2","ts":1741824000}'
encoded_str: str = pybase64.b64encode_as_string(telemetry_event)
print(encoded_str[:48] + "...")
# eyJldmVudCI6InBhZ2VfdmlldyIsInNlc3Npb25faWQi...
# Srovnání propustnosti (přibližné, liší se podle hardware)
# stdlib base64.b64encode(1 MB): ~80 MB/s
# pybase64.b64encode(1 MB): ~800 MB/s (cesta SIMD na CPU s AVX2)Přejdi na pybase64, když profilování ukáže, že kódování Base64 je úzkým hrdlem, nebo když opakovaně kóduješ datové části nad ~100 KB. Pro jednorázové kódování malých řetězců (přihlašovací údaje, tokeny) je stdlib dostatečně rychlá a nemá žádnou instalační závislost.
Výstup do terminálu se zvýrazněním syntaxe
Při ladění datových částí zakódovaných v Base64 v terminálu — zejména JSON konfigurací nebo obsahu JWT — ti knihovna rich poskytuje výstup se zvýrazněnou syntaxí a odsazením, který je mnohem čitelnější než surový výpis. Je zvláště užitečná v CLI nástrojích, ladicích skriptech a REPL relacích.
pip install rich
import base64
import json
from rich import print as rprint
from rich.syntax import Syntax
from rich.console import Console
console = Console()
def decode_and_pretty_print(encoded: str, label: str = "Dekódovaná datová část") -> None:
"""Dekóduje řetězec Base64, parsuje jako JSON a vypíše se zvýrazněním syntaxe."""
raw_bytes = base64.b64decode(encoded + "==") # tolerantní výplň
try:
parsed = json.loads(raw_bytes)
pretty = json.dumps(parsed, indent=2, ensure_ascii=False)
syntax = Syntax(pretty, "json", theme="monokai", line_numbers=False)
console.rule(f"[bold blue]{label}")
console.print(syntax)
except json.JSONDecodeError:
# Není JSON — vypsat surový text
console.rule(f"[bold yellow]{label} (surový text)")
rprint(raw_bytes.decode("utf-8", errors="replace"))
# Prozkoumání segmentu datové části JWT z neúspěšného požadavku na ověření
jwt_payload_segment = "eyJzdWIiOiJ1c3JfN2MzYTlmMWIyZCIsInJvbGUiOiJkYXRhLWVuZ2luZWVyIiwiZXhwIjoxNzQxOTEwNDAwfQ"
decode_and_pretty_print(jwt_payload_segment, "JWT Payload")rich používej pouze pro zobrazení v terminálu — pro ladění, logování na stdout nebo interaktivní CLI nástroje. Nikdy ho nezapisuj do souborů, nevracei ho z API koncových bodů ani ho neukládej do proměnných prostředí, protože rich přidává ANSI escape kódy, které data poškodí.Časté chyby
Prošel jsem mnoho Python kódových základen s kódováním Base64 a tyto čtyři chyby se vyskytují konzistentně — často neobjevené, dokud non-ASCII vstup nebo binární soubor nenarazí na kódovací cestu v produkci.
Chyba 1 — Předání str místo bytes do b64encode()
Problém: b64encode() očekává objekt bytes. Předání str okamžitě vyvolá TypeError: a bytes-like object is required. Oprava: vždy zavolej .encode("utf-8") na řetězci před kódováním.
import base64 # ❌ TypeError: a bytes-like object is required, not 'str' webhook_secret = "wh-secret-a3f91c2b4d" encoded = base64.b64encode(webhook_secret) # spadne
import base64
# ✅ Nejprve zakóduj str na bytes
webhook_secret = "wh-secret-a3f91c2b4d"
encoded = base64.b64encode(webhook_secret.encode("utf-8"))
# b'd2gtc2VjcmV0LWEzZjkxYzJiNGQ='Chyba 2 — Zapomenutí zavolat .decode() na výsledku bytes
Problém: b64encode() vrací bytes, nikoli str. Přímé vložení do f-řetězce vytvoří b'...' ve výstupu, což je neplatná hodnota HTTP hlavičky a rozbíjí JSON serializaci. Oprava: vždy zavolej .decode("ascii") na zakódovaném výsledku.
import base64
credential = base64.b64encode(b"svc-monitor:sk-7f3a1b")
# ❌ Hlavička Authorization obsahuje "b'c3ZjLW1vbml0b3I6c2stN2YzYTFi'"
headers = {"Authorization": f"Basic {credential}"}import base64
credential = base64.b64encode(b"svc-monitor:sk-7f3a1b").decode("ascii")
# ✅ Authorization: Basic c3ZjLW1vbml0b3I6c2stN2YzYTFi
headers = {"Authorization": f"Basic {credential}"}Chyba 3 — Použití encodebytes() tam, kde je potřeba b64encode()
Problém: encodebytes() vkládá \n každých 76 znaků (zalomení řádku MIME) a přidává závěrečné odřádkování. Uložení do JSON pole, proměnné prostředí nebo data URI vloží doslovné znaky odřádkování, které poškodí hodnotu dále v systému. Oprava: používej b64encode() všude kromě sestavování MIME e-mailů.
import base64, json
cert_bytes = open("./ssl/root-ca.crt", "rb").read()
# ❌ encodebytes() přidává \n každých 76 znaků — rozbíjí JSON a env vars
cert_b64 = base64.encodebytes(cert_bytes).decode()
config = json.dumps({"ca_cert": cert_b64}) # odřádkování uvnitř hodnoty řetězceimport base64, json
from pathlib import Path
cert_bytes = Path("./ssl/root-ca.crt").read_bytes()
# ✅ b64encode() vytvoří jeden nepřerušený řetězec
cert_b64 = base64.b64encode(cert_bytes).decode("ascii")
config = json.dumps({"ca_cert": cert_b64}) # čistá hodnota na jednom řádkuChyba 4 — Dekódování URL-bezpečného Base64 standardním dekodérem
Problém: URL-bezpečný Base64 používá - a _ místo + a /. Předání URL-bezpečného řetězce do b64decode() tiše produkuje nesprávné bajty pro každý segment, který tyto znaky obsahoval — ve výchozím nastavení se nevyvolá žádná výjimka. Oprava: pro URL-bezpečný vstup používej urlsafe_b64decode(), nebo předej validate=True pro včasné odhalení neshody.
import base64 # ❌ Segment datové části JWT používá URL-bezpečný Base64 (- a _) # b64decode() tiše produkuje nesprávné bajty pro tyto znaky jwt_segment = "eyJzdWIiOiJ1c3JfN2MzYTlmMWIyZCIsInJvbGUiOiJhZG1pbiJ9" wrong = base64.b64decode(jwt_segment) # tiše nesprávné pokud jsou přítomny - nebo _
import base64
# ✅ Použij urlsafe_b64decode() pro JWT a URL-bezpečný vstup
jwt_segment = "eyJzdWIiOiJ1c3JfN2MzYTlmMWIyZCIsInJvbGUiOiJhZG1pbiJ9"
padding = 4 - len(jwt_segment) % 4
raw = base64.urlsafe_b64decode(jwt_segment + "=" * (padding % 4))
# b'{"sub":"usr_7c3a9f1b2d","role":"admin"}'Metody Base64 v Pythonu — Rychlé srovnání
| Metoda | Vstupní typy | URL-bezpečné znaky | Výplň | Zalomení řádků | Vrací | Vyžaduje instalaci |
|---|---|---|---|---|---|---|
| b64encode() | bytes, bytearray, memoryview | ❌ + a / | ✅ =-výplň | ❌ žádné | bytes | Ne |
| urlsafe_b64encode() | bytes, bytearray, memoryview | ✅ - a _ | ✅ =-výplň | ❌ žádné | bytes | Ne |
| b64encode(altchars=b"-_") | bytes, bytearray, memoryview | ✅ 2 vlastní znaky | ✅ =-výplň | ❌ žádné | bytes | Ne |
| encodebytes() | bytes, bytearray, memoryview | ❌ + a / | ✅ =-výplň | ✅ \n každých 76 znaků | bytes | Ne |
| pybase64.b64encode() | bytes, bytearray, memoryview | ❌ + a / | ✅ =-výplň | ❌ žádné | bytes | pip install |
| pybase64.b64encode_as_string() | bytes, bytearray, memoryview | ❌ + a / | ✅ =-výplň | ❌ žádné | str | pip install |
Pro naprostou většinu případů použití zvol b64encode(): HTTP hlavičky, JSON pole, proměnné prostředí a data URI. Přejdi na urlsafe_b64encode(), kdykoli se výstup objeví v URL, názvu souboru, cookie nebo segmentu JWT. Používej encodebytes() pouze při sestavování MIME e-mailových příloh — zalomení řádků vyžaduje specifikace MIME, ale tiše rozbije vše ostatní. Sáhni po pybase64 při kódování datových částí nad ~100 KB na frekventované cestě.
Často kladené otázky
Související nástroje
Pro kódování nebo dekódování jedním kliknutím bez psaní Pythonu vlož svůj řetězec nebo soubor přímo do Base64 Encoder — zvládne standardní i URL-bezpečné režimy okamžitě v prohlížeči, bez jakéhokoli nastavení.
Maria is a backend developer specialising in Python and API integration. She has broad experience with data pipelines, serialisation formats, and building reliable server-side services. She is an active member of the Python community and enjoys writing practical, example-driven guides that help developers solve real problems without unnecessary theory.
Priya is a data scientist and machine learning engineer who has worked across the full Python data stack — from raw data ingestion and cleaning to model deployment and monitoring. She is passionate about reproducible research, Jupyter-based workflows, and the practical engineering side of ML. She writes about NumPy, Pandas, data serialisation, and the Python patterns that make data pipelines reliable at scale.