base64.b64encode()需传入bytes对象,必须用'rb'模式读取图片文件;返回值为bytes,转字符串需调用.decode('utf-8');大图建议分块处理。

用 base64.b64encode() 处理图片二进制流
Python 自带的 base64 模块是处理这类转换最轻量、最可靠的方式,关键在于不能直接传入文件路径或字符串,必须传入原始二进制数据(bytes)。常见错误是用 open(filename, 'r') 以文本模式打开图片——这会触发编码解码失败,直接报 UnicodeDecodeError。
- 务必用
open(filename, 'rb')读取,得到bytes对象 -
base64.b64encode()返回仍是bytes,如需存文本或拼接 URL Data URI,得调用.decode('utf-8') - 若图片较大,避免一次性
read()全部加载;可分块读取 + 累积编码,但一般小图(
生成 Data URI 格式字符串用于 HTML 或 JSON
单纯 Base64 编码串无法直接被浏览器识别为图片,必须加上 MIME type 前缀。不同格式对应不同前缀,漏写或写错会导致前端显示为空白或下载图标。
- JPEG →
data:image/jpeg;base64, - PNG →
data:image/png;base64, - GIF →
data:image/gif;base64, - 自动推断可用
imghdr.what()或python-magic,但生产环境建议显式指定,避免依赖文件扩展名
示例:
with open('avatar.png', 'rb') as f:
data = f.read()
encoded = base64.b64encode(data).decode('utf-8')
data_uri = f'data:image/png;base64,{encoded}'
从 Base64 字符串还原图片文件
反向操作常被忽略编码格式:如果原始字符串含 data:image/xxx;base64, 前缀,必须先切掉,否则 base64.b64decode() 会报 binascii.Error: Incorrect padding。
- 用
.split(',', 1)安全分离前缀和 Base64 主体(防止逗号出现在 payload 中) -
base64.b64decode()输入必须是 ASCII 字符串或 bytes,不能是含中文、空格等非法字符的字符串 - 写回文件时仍要用
'wb'模式,且确保目录存在,否则抛FileNotFoundError
注意跨平台换行与 URL 安全性问题
base64.b64encode() 默认输出不含换行,符合标准;但如果你误用了 base64.encodebytes(),它会在每 76 字符后加 \n,导致 Base64 串失效(尤其在 JSON 或 URL 中)。
- 永远优先用
b64encode(),不用encodebytes() - 若需 URL 安全(比如放在 GET 参数里),应改用
base64.urlsafe_b64encode(),它把+和/替换为-和_ - URL 安全编码后的字符串,解码时也必须用
urlsafe_b64decode(),混用会出错
真正容易被忽略的是:Base64 编码本身不压缩,反而让体积增大约 33%;存大量图片时,别只顾“转成字符串方便”,得权衡存储效率和使用场景。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











