前言
大家好,我是倔强青铜三 。欢迎关注我,微信公众号:倔强青铜三。点赞、收藏、关注,一键三连!
欢迎来到苦练Python第63天!
今天继续啃下另一只"配置文件界的瑞士军刀"------TOML。
TOML
是Tom's Obvious, Minimal Language的简写。
Python 3.11 起,标准库自带 tomllib,开箱即用,零依赖!
一、TOML 是什么?能做什么?
- 和 JSON、YAML 并列的三大配置文件格式之一。
- 像
.ini
的升级豪华版:支持嵌套表、数组、日期时间、注释。 - 典型场景:
pyproject.toml
(PEP 518 指定 Python 项目元数据)- Rust/Cargo、Node/npm、Go Modules 等语言生态的默认配置
- 机器学习超参数、CI/CD 流水线、容器编排文件
二、读 TOML ------ 把文件读成 dict
2.1 读取文件:tomllib.load
python
# demo_read_file.py
import tomllib
from pathlib import Path
# 1. 先造一份 TOML 文件
toml_text = '''
title = "我的项目"
[owner]
name = "倔强青铜三"
dob = 2000-06-01T12:34:56+08:00
[database]
ports = [ 8001, 8001, 8002 ]
enabled = true
'''
Path("config.toml").write_text(toml_text, encoding="utf-8")
# 2. 读取
with open("config.toml", "rb") as f:
conf = tomllib.load(f)
print("项目名:", conf["title"])
print("作者生日:", conf["owner"]["dob"])
print("数据库端口列表:", conf["database"]["ports"])
运行结果:
yaml
项目名: 我的项目
作者生日: 2000-06-01 12:34:56+08:00
数据库端口列表: [8001, 8001, 8002]
注意:必须以 二进制模式
"rb"
打开文件,防止编码踩坑。
2.2 读取字符串:tomllib.loads
python
# demo_read_str.py
import tomllib
toml_str = '''
[[users]]
id = 1
name = "张三"
[[users]]
id = 2
name = "李四"
'''
data = tomllib.loads(toml_str)
for user in data["users"]:
print(f"#{user['id']} 姓名: {user['name']}")
输出:
bash
#1 姓名: 张三
#2 姓名: 李四
三、类型对照表(牢记!)
TOML 类型 | Python 读出来 |
---|---|
string | str |
integer | int |
float | float(可自定义) |
boolean | bool |
offset date-time | datetime.datetime |
local date-time | datetime.datetime |
local date | datetime.date |
local time | datetime.time |
array | list |
table | dict |
表数组 | list[dict] |
四、自定义浮点解析:Decimal 防精度丢失
默认 tomllib
把 TOML 的 3.14
解析成 Python float
。想要 高精度小数 ?传个 parse_float
。
python
# demo_decimal.py
import tomllib
from decimal import Decimal
toml_str = "price = 19.99"
data = tomllib.loads(toml_str, parse_float=Decimal)
print(type(data["price"]), data["price"])
输出:
arduino
<class 'decimal.Decimal'> 19.99
规则:
parse_float
不能返回 dict/list,否则抛ValueError
。
五、异常处理:TOMLDecodeError
TOML 写错怎么办?tomllib.TOMLDecodeError
会告诉你行号。
python
# demo_error.py
import tomllib
bad_toml = "answer = 42\nthis line is broken >>>"
try:
tomllib.loads(bad_toml)
except tomllib.TOMLDecodeError as e:
print("解析失败:", e)
六、完整实战:把 TOML 读成 dict,再写回"极简 JSON"
任务:把
pyproject.toml
里的项目名、版本、依赖读出来,生成summary.json
(仅标准库)。
python
# demo_summary.py
import tomllib
import json
from pathlib import Path
# 1. 造一份 pyproject.toml
toml_content = '''
[project]
name = "toml_demo"
version = "0.1.0"
description = "tomllib 实战示例"
dependencies = ["requests>=2.31", "rich>=13.0"]
'''
Path("pyproject.toml").write_text(toml_content, encoding="utf-8")
# 2. 读 TOML
with open("pyproject.toml", "rb") as f:
data = tomllib.load(f)
proj = data["project"]
summary = {
"name": proj["name"],
"version": proj["version"],
"deps": proj["dependencies"]
}
# 3. 写 JSON
Path("summary.json").write_text(json.dumps(summary, ensure_ascii=False, indent=2), encoding="utf-8")
print("已生成 summary.json ↓")
print(json.dumps(summary, indent=2))
运行后生成 summary.json
:
json
{
"name": "toml_demo",
"version": "0.1.0",
"deps": [
"requests>=2.31",
"rich>=13.0"
]
}
七、小结
- tomllib.load 读文件,tomllib.loads 读字符串,返回值都是 dict。
- 支持全部 TOML 1.0.0 特性:表、表数组、日期时间、注释。
- 只读不写,写回文件请用
json
、configparser
或第三方 TOML Kit。 - 注意 二进制打开 和 TOMLDecodeError 异常捕获。
最后感谢阅读!欢迎关注我,微信公众号:
倔强青铜三
。欢迎点赞、收藏、关注,一键三连!!