Python 内置模块 base64
Base64 是一种基于64个可打印字符来表示二进制数据的编码方式。它使用 A-Z、a-z、0-9 以及 "+" 和 "/" 这64个字符,加上用于填充的 "=" 字符。Base64 常用于在文本协议中传输二进制数据,如电子邮件附件、网页中的图片数据等。
导入 base64 模块
import base64
基本编码和解码
字符串的编码和解码
import base64
# 原始字符串
text = "Hello, 世界!"
# 编码:字符串 -> bytes -> base64
encoded_bytes = base64.b64encode(text.encode('utf-8'))
encoded_string = encoded_bytes.decode('ascii')
print(f"编码结果: {encoded_string}")
# 解码:base64 -> bytes -> 字符串
decoded_bytes = base64.b64decode(encoded_string)
decoded_string = decoded_bytes.decode('utf-8')
print(f"解码结果: {decoded_string}")
二进制数据的编码和解码
import base64
# 原始二进制数据
binary_data = b'\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64'
# 编码
encoded = base64.b64encode(binary_data)
print(f"编码结果: {encoded}")
print(f"编码结果(字符串): {encoded.decode('ascii')}")
# 解码
decoded = base64.b64decode(encoded)
print(f"解码结果: {decoded}")
常用编码函数详解
标准 Base64 编码
import base64
data = b"Python base64 tutorial"
# b64encode() - 标准 Base64 编码
encoded = base64.b64encode(data)
print(f"标准编码: {encoded.decode()}")
# b64decode() - 标准 Base64 解码
decoded = base64.b64decode(encoded)
print(f"解码结果: {decoded.decode()}")
URL 安全的 Base64 编码
import base64
data = b"URL safe encoding test with special characters!"
# urlsafe_b64encode() - URL安全编码(用 - 和 _ 替代 + 和 /)
url_safe_encoded = base64.urlsafe_b64encode(data)
print(f"URL安全编码: {url_safe_encoded.decode()}")
# urlsafe_b64decode() - URL安全解码
url_safe_decoded = base64.urlsafe_b64decode(url_safe_encoded)
print(f"解码结果: {url_safe_decoded.decode()}")
# 对比标准编码
standard_encoded = base64.b64encode(data)
print(f"标准编码: {standard_encoded.decode()}")
Base32 编码
Base32 编码是一种将二进制数据转换为可打印字符的编码方式,它使用32个字符(A-Z和2-7)来表示数据,每个字符代表5个比特位。Base32 编码就是把二进制数据转换成可读性更好的字符串,方便在各种场景下使用和传输。
import base64
data = b"Base32 encoding example"
# b32encode() - Base32 编码
b32_encoded = base64.b32encode(data)
print(f"Base32编码: {b32_encoded.decode()}")
# b32decode() - Base32 解码
b32_decoded = base64.b32decode(b32_encoded)
print(f"解码结果: {b32_decoded.decode()}")
Base16 编码(十六进制)
Base16 编码,也称为十六进制编码,是一种将二进制数据转换为文本格式的编码方法。它使用16个字符(0-9和A-F)来表示每4个二进制位,使得二进制数据可以更容易地在文本环境中传输和存储。Base16编码后的数据量是原始数据的两倍
import base64
data = b"Hexadecimal encoding"
# b16encode() - Base16 编码
b16_encoded = base64.b16encode(data)
print(f"Base16编码: {b16_encoded.decode()}")
# b16decode() - Base16 解码
b16_decoded = base64.b16decode(b16_encoded)
print(f"解码结果: {b16_decoded.decode()}")
文件操作应用
图片文件的 Base64 编码
import base64
# 读取图片文件并编码
try:
with open('example.jpg', 'rb') as image_file:
image_data = image_file.read()
encoded_image = base64.b64encode(image_data)
# 保存为文本文件
with open('encoded_image.txt', 'w') as text_file:
text_file.write(encoded_image.decode('ascii'))
print("图片编码完成")
except FileNotFoundError:
print("图片文件不存在")
从 Base64 还原图片文件
import base64
# 从文本文件读取 Base64 数据并解码为图片
try:
with open('encoded_image.txt', 'r') as text_file:
encoded_data = text_file.read()
# 解码并保存为图片
decoded_data = base64.b64decode(encoded_data)
with open('restored_image.jpg', 'wb') as image_file:
image_file.write(decoded_data)
print("图片还原完成")
except FileNotFoundError:
print("编码文件不存在")
生成 Data URL
import base64
import mimetypes
def create_data_url(file_path):
try:
# 获取文件的 MIME 类型
mime_type, _ = mimetypes.guess_type(file_path)
if mime_type is None:
mime_type = 'application/octet-stream'
# 读取文件并编码
with open(file_path, 'rb') as file:
file_data = file.read()
encoded_data = base64.b64encode(file_data).decode('ascii')
# 生成 Data URL
data_url = f"data:{mime_type};base64,{encoded_data}"
return data_url
except FileNotFoundError:
return "文件不存在"
# 使用示例
data_url = create_data_url('example.png')
print(f"Data URL 前100个字符: {data_url[:100]}...")
HTTP 基本认证
import base64
def create_basic_auth_header(username, password):
# 组合用户名和密码
credentials = f"{username}:{password}"
# 编码为 Base64
encoded_credentials = base64.b64encode(credentials.encode('utf-8'))
# 创建 Authorization 头
auth_header = f"Basic {encoded_credentials.decode('ascii')}"
return auth_header
# 使用示例
username = "user123"
password = "pass456"
auth_header = create_basic_auth_header(username, password)
print(f"Authorization 头: {auth_header}")
错误处理和注意事项
处理无效的 Base64 数据
import base64
import binascii
def safe_base64_decode(encoded_data):
try:
decoded = base64.b64decode(encoded_data)
return decoded, None
except binascii.Error as e:
return None, f"Base64 解码错误: {e}"
except Exception as e:
return None, f"其他错误: {e}"
# 测试有效数据
valid_data = "SGVsbG8gV29ybGQ="
result, error = safe_base64_decode(valid_data)
if error:
print(error)
else:
print(f"解码成功: {result.decode()}")
# 测试无效数据
invalid_data = "Invalid@Base64!"
result, error = safe_base64_decode(invalid_data)
if error:
print(error)
else:
print(f"解码成功: {result.decode()}")
性能和内存注意事项
import base64
def encode_large_file_chunked(file_path, output_path, chunk_size=8192):
"""分块处理大文件的 Base64 编码"""
try:
with open(file_path, 'rb') as input_file, open(output_path, 'w') as output_file:
while True:
chunk = input_file.read(chunk_size)
if not chunk:
break
encoded_chunk = base64.b64encode(chunk).decode('ascii')
output_file.write(encoded_chunk)
print("大文件编码完成")
except FileNotFoundError:
print("输入文件不存在")
# 注意:这个示例需要实际的大文件来测试
# encode_large_file_chunked('large_file.bin', 'encoded_large_file.txt')
总结
base64 模块是 Python 中处理 Base64 编码的标准工具,主要用于:
- 数据传输:在文本协议中安全传输二进制数据
- 数据存储:将二进制数据存储为文本格式
- 网络通信:HTTP 基本认证、Data URL 等
- 数据处理:文件编码、图片处理等
使用时要注意编码后的数据大小会增加约33%,对于大文件建议使用分块处理以避免内存问题。选择合适的编码方式(标准 Base64、URL 安全、Base32 等)根据具体应用场景确定。