苦练Python第63天:零基础玩转TOML配置读写,tomllib模块实战

前言

大家好,我是倔强青铜三 。欢迎关注我,微信公众号:倔强青铜三。点赞、收藏、关注,一键三连!

欢迎来到苦练Python第63天!

今天继续啃下另一只"配置文件界的瑞士军刀"------TOML。

TOML是Tom's Obvious, Minimal Language的简写。

Python 3.11 起,标准库自带 tomllib,开箱即用,零依赖!


一、TOML 是什么?能做什么?

  • 和 JSON、YAML 并列的三大配置文件格式之一。
  • 像 .ini 的升级豪华版:支持嵌套表、数组、日期时间、注释。
  • 典型场景:
    1. pyproject.toml(PEP 518 指定 Python 项目元数据)
    2. Rust/Cargo、Node/npm、Go Modules 等语言生态的默认配置
    3. 机器学习超参数、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
表数组 listdict

四、自定义浮点解析: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 异常捕获。

最后感谢阅读!欢迎关注我,微信公众号:倔强青铜三。

欢迎点赞、收藏、关注,一键三连!!

相关推荐
2601_9669496512 分钟前
如何根据研究的起止时间截取分钟级行情?Python 实战与 QuantDash 数据处理指南
开发语言·python·pandas·量化交易·1024程序员节·股票数据·quantdash
张彦峰ZYF2 小时前
越过边界之前:Reward Seeker 实验如何改写智能体安全的时间逻辑
人工智能·ai agent·anthropic·智能体安全·reward seeker·“控制评价过程”泛化跨领域策略·envbom
拓恒技术2 小时前
无人机巡检AI算法的工程化落地:从需求到交付的5个核心环节
人工智能·算法·无人机
怕浪猫2 小时前
Claude Code vs Codex:Computer Use 实现原理深度拆解
算法·面试·github
罗西的思考4 小时前
AI 时代的 “房谋杜断”:如何培养能力、品味与判断力
人工智能·算法·机器学习
在世修行4 小时前
智学文枢:页面切换与跨页数据预填
python·桌面应用·signal·1024程序员节·pyside·跨页跳转·状态预填
字节跳动视频云技术团队5 小时前
720P 直升 8K,解密 2026 抖音美好奇妙夜巨幕超分黑科技
人工智能·音视频开发
2601_962885725 小时前
如何用 Python 把 K 线重采样成任意周期?
开发语言·python
打工仔折腾 AI5 小时前
在 Ubuntu ARM64 部署 Q1 V3.0 MuJoCo 模型:加载、单步推理与执行器响应解析
linux·运维·人工智能·python·深度学习·ubuntu·性能优化
逐米时代5 小时前
从试点验证到协同深化:制造业AI转型三年路线图设计方法
人工智能