Base64 in Python

Published

Python’s standard library module base64 covers standard Base64, Base64URL, Base32, Base16 and Ascii85. Its functions take and return bytes, which is the first thing to remember.

Encode a string

import base64

encoded = base64.b64encode("Grüße 👋".encode("utf-8"))
print(encoded)            # b'R3LDvMOfZSDwn5GL'
print(encoded.decode())   # 'R3LDvMOfZSDwn5GL'  (str)

Passing a str directly raises TypeError: a bytes-like object is required, not 'str'.

Decode to a string

text = base64.b64decode("R3LDvMOfZSDwn5GL").decode("utf-8")

b64decode accepts both str (ASCII only) and bytes.

Strict validation

By default b64decode silently discards characters outside the alphabet. Pass validate=True to reject them:

import binascii

try:
    data = base64.b64decode(value, validate=True)
except binascii.Error as e:
    print("Invalid Base64:", e)

“Incorrect padding” error

binascii.Error: Incorrect padding means the length is not a multiple of 4. This is common with Base64URL values from JWTs or URLs, which omit =. Restore the padding:

def b64decode_nopad(s: str) -> bytes:
    return base64.urlsafe_b64decode(s + "=" * (-len(s) % 4))

Base64URL

base64.urlsafe_b64encode(b"\xfb\xff").decode()   # '-_8='
base64.urlsafe_b64encode(data).rstrip(b"=")      # without padding

Files and images

from pathlib import Path

b64 = base64.b64encode(Path("logo.png").read_bytes()).decode()
data_uri = f"data:image/png;base64,{b64}"

Path("restored.png").write_bytes(base64.b64decode(b64))

For very large files use base64.encode(infile, outfile), which streams and wraps lines at 76 characters (MIME style).

Line breaks

b64encode never adds line breaks. base64.encodebytes() inserts a newline every 76 characters, as required by e-mail (MIME). b64decode ignores newlines only when validate=False.

Command line

python3 -m base64 file.bin        # encode
python3 -m base64 -d file.b64     # decode

Verify your output with the Base64 decoder or check the value with the validator.

Comments (0)

Questions, ideas or a bug in “Base64 in Python”? Leave a comment, rate the tool, or reply to others.

No comments yet. Be the first to share your feedback!

Leave a comment

Rate this tool:
Esc
↑ ↓ move↵ openEsc close