tomllib 是 python 3.11+ 标准库中专用于只读解析 toml 的模块,必须以二进制模式("rb")读取文件,不支持写入、无 parse_float 参数,旧版本需用 tomli 兼容。

tomllib 的存在不是为了“替代谁”,而是把一个高频、稳定、低风险的配置解析需求,从第三方生态收编进标准库——省掉一个 pip install tomli,少一个依赖链,少一次版本冲突。
tomllib.load() 必须用 "rb" 模式打开文件
TOML 规范要求解析器以字节流方式读取,避免编码歧义。Python 3.11 的 tomllib.load() 明确只接受二进制文件对象(fp),传入文本模式("r")会直接报 TypeError: expected a bytes-like object, or an object with a read() method returning bytes。
- 一定要写
open("config.toml", "rb"),不能写"r" - 即使文件是 UTF-8 编码,也不能靠
encoding="utf-8"补救——tomllib不接受该参数 - 如果你手抖写了
open(..., "r", encoding="utf-8"),会卡在类型检查上,连解析逻辑都进不去
Python 版本兼容必须显式处理
tomllib 在 3.10 及以下版本根本不存在,硬 import 就是 ModuleNotFoundError。没有“自动降级”这回事。
- 旧项目要跑在 3.9/3.10?必须装
tomli:pip install tomli - 兼容写法只能靠 try/except,且 alias 要统一:
try: import tomllib except ModuleNotFoundError: import tomli as tomllib
- 注意:
tomli支持parse_float参数,tomllib不支持——如果代码里用了这个参数,降级后会报错
tomllib 只读不写,别指望它生成 TOML
tomllib 是纯解析器,只提供 load() 和 loads(),没有 dump() 或 dumps()。它不负责格式化、不保留注释、不处理缩进。
- 需要写入或编辑现有
.toml文件?得另配包,比如tomli-w(轻量)或tomlkit(保留结构和注释) - 如果误以为
tomllib能 round-trip(读→改→写),最后发现写出来只是个普通字典转 JSON 式字符串,就踩坑了
真正容易被忽略的是:TOML 的类型映射看似直觉,但浮点数精度、带时区的 datetime、数组嵌套表这些边界情况,tomllib 会严格按规范转成 Python 原生类型,不会做任何“人性化转换”。比如 2023-01-01T12:00:00+08:00 会变成 datetime.datetime 对象,不是字符串——这点在做配置校验或序列化回传时,常导致 TypeError: Object of type datetime is not JSON serializable。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











