Of course! Here’s a comprehensive guide on how to perform Base64 encoding in Python, covering the standard library, URL-safe encoding, and decoding.

The Short and Simple Answer
For most cases, you'll use the base64 module from Python's standard library.
import base64
# The data you want to encode (must be bytes)
data_string = "Hello, World!"
data_bytes = data_string.encode('utf-8')
# Encode the bytes to a Base64 string
encoded_bytes = base64.b64encode(data_bytes)
# The result is in bytes, so decode it to a string for easy use
encoded_string = encoded_bytes.decode('utf-8')
print(f"Original String: {data_string}")
print(f"Encoded String: {encoded_string}")
# --- Decoding ---
# To decode, you first need to encode the string back to bytes
decoded_bytes = base64.b64decode(encoded_string)
# Then decode the bytes back to a string
decoded_string = decoded_bytes.decode('utf-8')
print(f"Decoded String: {decoded_string}")
Output:
Original String: Hello, World!
Encoded String: SGVsbG8sIFdvcmxkIQ==
Decoded String: Hello, World!
Detailed Breakdown
Let's break down the process and explore different options.
The Core Concept: Bytes
Base64 encoding operates on bytes, not strings. Therefore, the first and most crucial step is to convert your string data into a bytes-like object.

-
Encoding a String: Use the
.encode()method with a specific character encoding (almost alwaysutf-8).my_string = "Python" my_bytes = my_string.encode('utf-8') # Converts 'Python' to b'Python' -
Decoding to a String: After decoding from Base64, you get bytes back. You must convert them to a string using
.decode().decoded_bytes = b'UHl0aG9u' # This is the Base64 for "Python" my_string = decoded_bytes.decode('utf-8') # Converts back to "Python"
The base64 Module
This is Python's built-in module for Base64 operations.
| Function | Purpose | Input | Output |
|---|---|---|---|
base64.b64encode(s) |
Standard Base64 encoding. | bytes |
bytes (Base64 encoded) |
base64.b64decode(s) |
Standard Base64 decoding. | bytes or string |
bytes (original data) |
base64.urlsafe_b64encode(s) |
URL-safe Base64 encoding. | bytes |
bytes (URL-safe Base64) |
base64.urlsafe_b64decode(s) |
URL-safe Base64 decoding. | bytes or string |
bytes (original data) |
Common Scenarios
Scenario 1: Encoding a String (The Most Common Case)
This is the example from the top, but with more comments.

import base64
# 1. Start with a string
message = "This is a secret message."
# 2. Convert the string to bytes using UTF-8 encoding
message_bytes = message.encode('utf-8')
# 3. Encode the bytes to Base64
base64_bytes = base64.b64encode(message_bytes)
# 4. Convert the Base64 bytes to a string for printing/storage
base64_message = base64_bytes.decode('utf-8')
print(f"Original: {message}")
print(f"Base64: {base64_message}")
Output:
Original: This is a secret message.
Base64: VGhpcyBpcyBhIHNlY3JldCBtZXNzYWdlLg==
Scenario 2: Encoding a File
You can read a file in binary mode and encode its contents directly.
import base64
# Assume 'my_image.png' exists in the same directory
input_filename = 'my_image.png'
output_filename = 'my_image.b64'
# 1. Open the file in binary read mode ('rb')
with open(input_filename, 'rb') as f_in:
# 2. Read the file's content as bytes
file_content = f_in.read()
# 3. Encode the bytes to Base64
encoded_content = base64.b64encode(file_content)
# 4. Write the Base64 bytes to a new file in binary write mode ('wb')
with open(output_filename, 'wb') as f_out:
f_out.write(encoded_content)
print(f"File '{input_filename}' has been encoded to '{output_filename}'.")
Scenario 3: URL-Safe Encoding
Standard Base64 uses and , which have special meanings in URLs. URL-safe Base64 replaces them with and _.
import base64
# Data that might be used in a URL
data = "https://www.example.com/path?query=value"
data_bytes = data.encode('utf-8')
# Standard Base64
standard_encoded = base64.b64encode(data_bytes).decode('utf-8')
print(f"Standard Base64: {standard_encoded}")
# URL-Safe Base64
urlsafe_encoded = base64.urlsafe_b64encode(data_bytes).decode('utf-8')
print(f"URL-Safe Base64: {urlsafe_encoded}")
Output:
Standard Base64: aHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vcGF0aD9xdWVyeT12YWx1ZQ==
URL-Safe Base64: aHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vcGF0aD9xdWVyeT12YWx1ZQ==
Notice that in this specific case, the result is the same because the original data didn't contain characters that would be changed. However, if the original data contained a byte that resulted in a or in the standard encoding, the URL-safe version would be different.
Scenario 4: Decoding
The process is the reverse of encoding.
import base64
# The Base64 string you want to decode
encoded_string = "VGhpcyBpcyBhIHNlY3JldCBtZXNzYWdlLg=="
# 1. Encode the string to bytes (the function can take a string directly)
encoded_bytes = encoded_string.encode('utf-8')
# 2. Decode the Base64 bytes
decoded_bytes = base64.b64decode(encoded_bytes)
# 3. Convert the decoded bytes back to a string
original_message = decoded_bytes.decode('utf-8')
print(f"Encoded: {encoded_string}")
print(f"Decoded: {original_message}")
Output:
Encoded: VGhpcyBpcyBhIHNlY3JldCBtZXNzYWdlLg==
Decoded: This is a secret message.
Summary and Best Practices
- Use the
base64module: It's built-in, fast, and reliable. - Handle Bytes: Remember that Base64 works on bytes. Always
.encode()your strings before encoding and.decode()the result after decoding. - Choose the Right Encoding:
- Use
b64encodefor general-purpose data (e.g., email attachments, API responses). - Use
urlsafe_b64encodefor data that will be used in URLs, file names, or JSON web tokens (JWTs).
- Use
- Error Handling: If you try to decode invalid Base64 data,
base64.b64decode()will raise abinascii.Error. Wrap your decoding logic in atry...exceptblock if the input data might be corrupted or malformed.
