简介
配置文件并不是什么新鲜玩意,Python标准库也支持多种配置文件格式,比如Windows中最常见的ini
格式;网络传输最常用的json
,甚至xml
文件。
toml
文件也是配置文件的一种,具有更强的可读性,在其官网的介绍中,对这种格式的描述是A config file format for humans
。
Python3.11的标准库中添加了专门处理这种文件的模块,即tomllib
模块。下面介绍toml
的基本规范。
在toml
中,支持的数据类型有字符串、整数、浮点数、日期时间;支持的数据结构有数组、表格以及数组表格。
牛刀小试
多说无益,直接上代码,例如对于下面这段toml
# 在toml中#表示注释
name = "TOML"
info = """
在TOML中,
支持多行字符串
"""
pyVersion = 3.11
date = 2022-12-26
在Python中打开后
import tomllib
with open("test.toml", "rb") as f:
data = tomllib.load(f)
from pprint import pprint
pprint(data)
输出结果如下
{‘date’: datetime.date(2022, 12, 26),
‘info’: ‘在TOML中,\n支持多行字符串\n’,
‘name’: ‘TOML’,
‘pyVersion’: 3.11}
可见,tomllib
将toml
文件自动改成了字典格式,且识别出了日期时间、多行字符串、单行字符串以及浮点型数字。
字符串
在toml
标准中,支持两种字符串格式,分别用双引号和单引号表示。
其中,双引号包裹的字符串为基本字符串,内部支持常用的转义字符
\b | \t | \n | \f | \r | " | \\ |
---|---|---|---|---|---|---|
退格 | tab | 换行 | 换页 | 回车 | 引号 | 斜杠 |
此外,\uXXXX
可表示码号为XXXX
的unicode字符。
用单引号包裹的字符串为字面量字符串,不支持转义字符,所以字面量字符串中无法输入单引号。
三个引号可以表示多行字符串,三个双引号对表示的是多行基本字符串;三个单引号对括起来的字符串为多行字面量字符串。
数值
在tomllib
中,数值可用下划线连接,这一点非常便捷,例如299_732_458
,从而可以方便地划分位数,具有极强的可读性。
此外,还支持十六进制、八进制和二进制整数
进制 | 示例 |
---|---|
十六进制 | 0xDEADBEEF, 0xdeadbeef, 0xdead_beef |
八进制 | 0o01234567 |
二进制 | 0b11010110 |
浮点数用E
或者e
表示指数,示例如下
# 小数
c = 2.99_732e8
b = 0.53E-10
me = 9.1e-31
toml
支持布尔类型,分别用小写的true
和false
表示。
最简单的日期时间如下
d = 2022-02-22
t = 2:22:22.222
dt = 2022-02-22 2:22:22.222
数据结构
列表
对于Pythoner而言,toml
中的列表和字典毫无理解难度,下面的示例如果不说的话,当作Python代码是没有任何问题的。
lst1 = [ 1, 2, 3 ]
lst2 = [ "r", "g", "b" ]
lst3 = [ 1, 2, 3, 'r', 'g', 'b']
# 列表可以换行
lst4 = [ [ 1, 2 ],
["r", "g", "b"] ]
lst5 = [ "所有的", '字符串', """是相同的""", '''类型''' ]
字典
在toml
中,字典被称为内联表,和Python相比,唯一的区别是用=
替代了:
,
dct = { name = "微小冷",
url = "https://tinycool.blog.csdn.net/" }
内联表在toml
中的标准定义如下
[dct]
name = "微小冷"
url = "https://tinycool.blog.csdn.net/"
表还支持通过点索引进行嵌套,例如下面的表
[dog."tater.man"]
type.name = "pug"
等价于下列json的结构
{ "dog": { "tater.man": { "type": { "name": "pug" } } } }
字典列表
如果想定义一个字典的列表,可写成如下形式
[[products]]
name = “Hammer”
sku = 738594937
[[products]] # 数组里的空表
[[products]]
name = “Nail”
sku = 284758393
color = “gray”
等价于
{
"products": [
{ "name": "Hammer", "sku": 738594937 },
{ },
{ "name": "Nail", "sku": 284758393, "color": "gray" }
]
}