tomllib是python 3.11+唯一内置toml解析器,需用open("f.toml","rb")传二进制文件对象,解析失败抛出带行列信息的tomldecodeerror,严格按规范转换类型且不支持智能转换。

tomllib 是 Python 3.11+ 唯一内置的 TOML 解析器
它不是“推荐用”,而是标准库唯一提供的方案——tomllib 自 Python 3.11 起正式纳入 stdlib,无需 pip install,没有版本冲突风险。你写 import tomllib 就能用,前提是 Python 版本 ≥ 3.11。低于这个版本会直接报 ModuleNotFoundError: No module named 'tomllib',不存在“降级自动兼容”这回事。
必须用 open(..., "rb"),不能传路径或文本模式
tomllib.load() 只接受二进制文件对象,不是字符串路径,也不是文本模式打开的文件。常见错误包括:
-
tomllib.load("config.toml")→ 报错:TypeError: expected bytes, got str -
open("config.toml", "r")→ 即使加了encoding="utf-8",也会在类型检查阶段失败,因为tomllib.load()根本不接收文本流 - 正确写法只有这一种:
with open("config.toml", "rb") as f: config = tomllib.load(f)
它依赖字节流解析,是为了严格遵循 TOML v1.0.0 规范中对编码无歧义的要求,不是设计疏漏。
解析失败时能精确定位到 .line 和 .col
一旦 TOML 语法出错(比如键名含空格却没加引号、布尔值写了 True 而非 true、日期格式多了一个空格),tomllib 会抛出 tomllib.TOMLDecodeError,且带准确行列信息:
TOMLDecodeError: Invalid literal character: 'x' (line 5, column 12)
这比靠肉眼扫几百行配置高效得多。但注意:这个异常类型和旧版 tomli 的 tomli.TOMLDecodeError 不兼容,捕获时必须写全路径,不能只写 except TOMLDecodeError:。
它不做“智能转换”,但也不偷偷改你的数据
tomllib 严格按规范映射类型:时间戳变成 datetime 对象、整数保持为 int、浮点数是 float、数组是 list、表是 dict。它不提供 parse_float 参数(tomli 支持,但 tomllib 明确删掉了),也不把 "2023-01-01" 自动转成 date。这种“不作为”反而是优势:行为可预测,不会在不同环境里因隐式转换导致 TypeError: Object of type datetime is not JSON serializable 这类问题。
真正容易被忽略的是:它返回的 dict 里可能嵌着 datetime、date、time 等原生对象——如果你后续要 json.dumps() 或存进数据库,得自己处理这些类型,tomllib 不会替你兜底。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











