Base64编码后数据体积增大约33.3%,因其将每3字节二进制数据编码为4个ASCII字符,导致存储效率降为75%,且需填充字符“=”;文本模式读文件会返回str而非bytes,引发TypeError。

直接用 base64.b64encode() 读二进制再编码,但必须注意文件打开模式和换行符处理,否则解码会失败。
为什么 open(..., 'r') 会导致 TypeError: a bytes-like object is required
因为 base64.b64encode() 只接受 bytes,而文本模式('r')读出的是 str。Python 3 中字符串和字节严格区分,不能混用。
- 必须用
open(path, 'rb')——b表示 binary 模式 - 读取结果是
bytes,可直接传给base64.b64encode() - 别试图用
.encode('utf-8')转文本内容,图片不是 UTF-8 文本
如何生成可用于 HTML <img> 的 data URL
单纯 base64 编码的字符串不能直接当 src 使用,得拼上 MIME 类型前缀,否则浏览器无法识别格式。
- 先用
pathlib.Path或os.path.splitext()获取后缀,映射为 MIME 类型(如.png→image/png) - 编码后用
.decode('ascii')转成字符串(base64.b64encode()返回bytes) - 组合成
data:{mimetype};base64,{b64str}格式
示例:
立即学习“Python免费学习笔记(深入)”;
import base64
from pathlib import Path
img_path = Path("photo.jpg")
mime_type = f"image/{img_path.suffix[1:].lower()}"
with open(img_path, "rb") as f:
b64_bytes = base64.b64encode(f.read())
b64_str = b64_bytes.decode("ascii")
data_url = f"data:{mime_type};base64,{b64_str}"
大图编码时内存暴涨?用 base64.encodebytes() 替代 b64encode()
base64.b64encode() 返回紧凑无换行的 bytes,适合存储;但若图片超大(比如 >50MB),一次性读入内存可能 OOM。而 base64.encodebytes() 支持分块读取,更可控。
-
encodebytes()会在每 76 字符后加换行符(\n),输出略长,但可配合io.BytesIO流式处理 - 真正省内存的做法是:用
chunk_size = 8192分次f.read(chunk_size),累积 buffer 后再 encode(需手动处理边界) - 日常小图(b64encode() 更简单,无需过度优化
容易被忽略的是:Base64 编码后体积膨胀约 33%,且不压缩原始像素——它只是编码,不是压缩。如果目标是减小传输体积,优先考虑 WebP 格式或服务端压缩,而非 base64。


















