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

作者:倔强青铜三 VIP.1 初学乍练日期:2025/10/11

前言

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

欢迎来到苦练Python第63天

今天继续啃下另一只“配置文件界的瑞士军刀”——TOML

TOMLTom’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

1# demo_read_file.py
2import tomllib
3from pathlib import Path
4
5# 1. 先造一份 TOML 文件
6toml_text = '''
7title = "我的项目"
8
9[owner]
10name = "倔强青铜三"
11dob = 2000-06-01T12:34:56+08:00
12
13[database]
14ports = [ 8001, 8001, 8002 ]
15enabled = true
16'''
17Path("config.toml").write_text(toml_text, encoding="utf-8")
18
19# 2. 读取
20with open("config.toml", "rb") as f:
21    conf = tomllib.load(f)
22
23print("项目名:", conf["title"])
24print("作者生日:", conf["owner"]["dob"])
25print("数据库端口列表:", conf["database"]["ports"])
26

运行结果:

1项目名: 我的项目
2作者生日: 2000-06-01 12:34:56+08:00
3数据库端口列表: [8001, 8001, 8002]
4

注意:必须以 二进制模式 "rb" 打开文件,防止编码踩坑。


2.2 读取字符串:tomllib.loads

1# demo_read_str.py
2import tomllib
3
4toml_str = '''
5[[users]]
6id = 1
7name = "张三"
8
9[[users]]
10id = 2
11name = "李四"
12'''
13
14data = tomllib.loads(toml_str)
15for user in data["users"]:
16    print(f"#{user['id']} 姓名: {user['name']}")
17

输出:

1#1 姓名: 张三
2#2 姓名: 李四
3

三、类型对照表(牢记!)

TOML 类型Python 读出来
stringstr
integerint
floatfloat(可自定义)
booleanbool
offset date-timedatetime.datetime
local date-timedatetime.datetime
local datedatetime.date
local timedatetime.time
arraylist
tabledict
表数组list[dict]

四、自定义浮点解析:Decimal 防精度丢失

默认 tomllib 把 TOML 的 3.14 解析成 Python float。想要 高精度小数?传个 parse_float

1# demo_decimal.py
2import tomllib
3from decimal import Decimal
4
5toml_str = "price = 19.99"
6data = tomllib.loads(toml_str, parse_float=Decimal)
7print(type(data["price"]), data["price"])
8

输出:

1<class 'decimal.Decimal'> 19.99
2

规则:parse_float 不能返回 dict/list,否则抛 ValueError


五、异常处理:TOMLDecodeError

TOML 写错怎么办?tomllib.TOMLDecodeError 会告诉你行号。

1# demo_error.py
2import tomllib
3
4bad_toml = "answer = 42\nthis line is broken >>>"
5try:
6    tomllib.loads(bad_toml)
7except tomllib.TOMLDecodeError as e:
8    print("解析失败:", e)
9

六、完整实战:把 TOML 读成 dict,再写回“极简 JSON”

任务:把 pyproject.toml 里的项目名、版本、依赖读出来,生成 summary.json(仅标准库)。

1# demo_summary.py
2import tomllib
3import json
4from pathlib import Path
5
6# 1. 造一份 pyproject.toml
7toml_content = '''
8[project]
9name = "toml_demo"
10version = "0.1.0"
11description = "tomllib 实战示例"
12dependencies = ["requests>=2.31", "rich>=13.0"]
13'''
14Path("pyproject.toml").write_text(toml_content, encoding="utf-8")
15
16# 2. 读 TOML
17with open("pyproject.toml", "rb") as f:
18    data = tomllib.load(f)
19
20proj = data["project"]
21summary = {
22    "name": proj["name"],
23    "version": proj["version"],
24    "deps": proj["dependencies"]
25}
26
27# 3. 写 JSON
28Path("summary.json").write_text(json.dumps(summary, ensure_ascii=False, indent=2), encoding="utf-8")
29print("已生成 summary.json ↓")
30print(json.dumps(summary, indent=2))
31

运行后生成 summary.json

1{
2  "name": "toml_demo",
3  "version": "0.1.0",
4  "deps": [
5    "requests>=2.31",
6    "rich>=13.0"
7  ]
8}
9

七、小结

  • tomllib.load 读文件,tomllib.loads 读字符串,返回值都是 dict
  • 支持全部 TOML 1.0.0 特性:表、表数组、日期时间、注释。
  • 只读不写,写回文件请用 jsonconfigparser 或第三方 TOML Kit
  • 注意 二进制打开TOMLDecodeError 异常捕获。

最后感谢阅读!欢迎关注我,微信公众号:倔强青铜三
欢迎点赞、收藏、关注,一键三连!!


苦练Python第63天:零基础玩转TOML配置读写,tomllib模块实战》 是转载文章,点击查看原文


相关推荐


1688 店铺商品全量采集与智能分析:从接口调用到供应链数据挖掘
一人の梅雨2025/10/9

一、技术定位与商业价值重构 1688 店铺商品接口(alibaba.item.list.get)作为获取店铺全量商品数据的核心入口,其价值远不止于简单的数据采集。与常规实现不同,本文方案聚焦B 端供应链数据的深度挖掘,通过商品结构化解析、价格策略分析、供应链能力评估三大维度,解决批发商关注的 "店铺品类布局"" 批量采购议价空间 ""供应商履约能力" 等核心问题,构建从数据采集到商业决策的完整技术链路。 区别于网络上常见的基础调用示例,本方案实现三大突破: 支持全量商品智能分页(突破单页限


Redis Zset 类型全解析
gsfl2025/10/8

文章目录 1.引言2.Zset 类型的核心特性与 Set、List 的关键差异 3.Zset 类型核心命令3.1 元素添加与基础查询:zadd、zrangezaddzrange 3.2 元素计数:zcard、zcountzcardzcount 3.3 排序与排名查询:zrevrange、zrangebyscore、zrank、zrevrank、zscorezrevrangezrangebyscorezrankzrevrankzscore 3.4 元素删除:zpopmax、


Python 的内置函数 bool
IMPYLH2025/10/6

Python 内建函数列表 > Python 的内置函数 bool 在编程中,我们经常需要判断某个值是“真”(True)还是“假”(False),而 bool() 函数就是 Python 提供的用于进行布尔值转换的强大工具。无论是数字、字符串、列表,还是自定义对象,bool() 都能帮助我们快速评估它们的真假状态。 bool 是一个类,它的参数如下: class bool(x=False): ''' 类型转换为 bool :param x: 一个变量 :r


【Linux CentOS 7 版本更换yum源】
zhaotiannuo_19982025/10/5

Linux CentOS 7 版本更换yum源 1、备份文件 cd /etc/yum.repos.d/ mkdir backup mv /etc/yum.repos.d/Cen* backup 2、下载文件 http://mirrors.aliyun.com/repo/Centos-7.repo 3、通过xftp 文件传输工具传输到/etc/yum.repos.d/目录下 4、清理软件源,建立缓存 yum clean all yum makecache 5、检查是否更新成功 yum repo


Claude 4.5 升级解析:很强,但请别跳过“Imagine”
飞哥数智谈2025/10/4

9月30号,Anthropic 发布了 Claude 4.5。 因为最近一直在尝试 Claude Code 的各种场景,所以先尝试了 Claude Code 2.0,今天才有空完整地了解下 Claude 4.5 这次升级。 尤其是预览的“Imagine with Claude”,强烈建议了解下。 升级内容 模型核心能力 先通过评测标准的得分直观了解下升级的程度。 各方面均有所提升,但其实没有这个分数,大家估计对 Claude 的能力也没什么怀疑的。 毕竟,最佳的通用 AI 可能还会有一点点争议


【网络编程】深入 HTTP:从报文交互到服务构建,洞悉核心机制
半桔2025/10/3

半桔:个人主页  🔥 个人专栏: 《Linux手册》《手撕面试算法》《网络编程》 🔖有些鸟儿注定是不会被关在牢笼里的,因为它们的每一片羽毛都闪耀着自由的光辉。 文章目录 一. 前言二. 基础知识2.1 URL 三. 请求报文四. 响应报文五. 实现HTTP服务器六. HTTP的细节字段6.1 请求方法6.2 状态码6.3 常见的报头6.4 Cookie和Session ID 一. 前言 在如今的数字时代,我们每天打开浏览器浏览新闻、刷社交媒


榨干每一滴算力:ONNX Runtime 多维优化实战指南
Cosolar2025/10/2

在当今人工智能应用快速落地的背景下,模型部署的效率和稳定性已成为决定产品成败的关键因素之一。ONNX(Open Neural Network Exchange)作为一种开放的模型交换格式,配合 ONNX Runtime(ORT)推理引擎,已成为工业界广泛采用的模型部署方案。然而,仅仅将模型转换为 ONNX 格式并不足以获得最佳性能。真正高效的推理部署,需要从模型优化、推理引擎配置、硬件加速和系统集成等多个维度协同发力。本文将结合实际经验,深入探讨如何通过 ONNX Runtime 实现模型部署的


​​FeedMe (RSS阅读器) 信息聚合/阅读体验优化​​
2501_935689192025/10/2

获取地址:​​FeedMe (RSS阅读器) FeedMe 是一款设计简洁、体验流畅的RSS阅读器应用,支持多平台使用。该应用提供智能分类、关键词过滤、离线下载等核心功能,并具备文章朗读、稍后阅读等增强特性。其清爽的阅读界面与手势操作设计,让用户能够高效获取并管理订阅的资讯内容


分布式专题——24 Kafka功能扩展
失散1310/2/2025

Kafka 性能压测、搭建 Kafka 监控平台 EFAK、Kraft 集群、Kafka 与流式计算


机器学习-第三章 线性模型
weixin_429630269/30/2025

斜率0.994表示:月广告费每增加1万元,月销售量平均增加0.994万元。- 截距-0.220表示:当广告费为0时,销售量的基准值约为-0.220万元。线性回归方程:y = 0.994x + -0.220。决定系数R²:0.9642(越接近1,拟合效果越好)

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0