TOML
是一种用于配置文件的轻量级、易读的数据序列化格式。
由Tom Preston-Werner创建,旨在成为一种简单直观的配置文件语言,适用于任何编程语言环境。
TOML
支持多种数据类型,包括字符串、整数、浮点数、布尔值、日期时间、数组和嵌套表等等。
TOML
通常用于配置应用程序或软件的设置,例如配置数据库连接信息、网络参数、日志级别等。
在许多编程语言中,都有第三方库或原生支持,用于解析和生成TOML
格式的配置文件。
Python
从3.11
版本开始,原生支持TOML
的解析,不需要再安装第三方的库。
1. 基本类型
配置项的值在TOML
中也像在JSON
中一样,是可以有类型的。
它说支持的基本类型主要有布尔值,数值(整数,浮点数),字符串和日期等几种。
1.1. 布尔值
python
中的TOML
模块可以加载toml
格式的字符串,或者toml
文件的文件流。
# -*- coding: utf-8 -*- import tomllib # 加载toml文件 with open("./sample.toml", "rb") as f: data = tomllib.load(f) print("bool_var1 = ", data["bool_var1"]) print("bool_var2 = ", data["bool_var2"]) # 运行结果 bool_var1 = False bool_var2 = True
toml
文件示例:sample.toml
bool_var1 = false bool_var2 = true
1.2. 数值
数值类型分为整数和浮点数两种。
整型除了10进制,也可以用16进制,8进制和2进制。
# 10进制 int_var1 = 99 int_var2 = -17 int_var3 = 1_234_000 # 16进制,大小写都可以 hex_var1 = 0xDE hex_var2 = 0xde # 8进制 oct_var = 0o666 # 2进制 bin_var = 0b11010110
解析之后,会自动转换成10进制。
with open("./sample.toml", "rb") as f: data = tomllib.load(f) print("int_var1 = ", data["int_var1"]) print("int_var2 = ", data["int_var2"]) print("int_var3 = ", data["int_var3"]) print("hex_var1 = ", data["hex_var1"]) print("hex_var2 = ", data["hex_var2"]) print("oct_var = ", data["oct_var"]) print("bin_var = ", data["bin_var"]) # 运行结果 int_var1 = 99 int_var2 = -17 int_var3 = 1234000 hex_var1 = 222 hex_var2 = 222 oct_var = 438 bin_var = 214
浮点型的各种配置示例:
float_var1 = 3.1415 float_var2 = -0.01 float_var3 = 5e+22 float_var4 = -2E-2 float_var5 = 6.626e-34
解析示例:各种格式的float
写法都可以解析。
with open("./sample.toml", "rb") as f: data = tomllib.load(f) print("float_var1 = ", data["float_var1"]) print("float_var2 = ", data["float_var2"]) print("float_var3 = ", data["float_var3"]) print("float_var4 = ", data["float_var4"]) print("float_var5 = ", data["float_var5"]) # 运行结果 float_var1 = 3.1415 float_var2 = -0.01 float_var3 = 5e+22 float_var4 = -0.02 float_var5 = 6.626e-34
1.3. 字符串
对于字符串类型的配置项,支持单行和多行字符串。
配置文件示例:
str_single = "abcdefg" str_multi = """ab cd ef """
解析示例:
with open("./sample.toml", "rb") as f: data = tomllib.load(f) print("str_single = ", data["str_single"]) print("str_multi = ", data["str_multi"]) # 运行结果 str_single = abcdefg str_multi = ab cd ef
字符串的配置除了单行和多行以外,还有单引号和双引号的区别。
- 单引号字符串:原样显示字符串内容
- 双引号字符串:解析字符串中的转义符
str_var1 = "ab\tcd\nef" str_var2 = 'ab\tcd\nef'
解析之后:
with open("./sample.toml", "rb") as f: data = tomllib.load(f) print("str_var1 = ", data["str_var1"]) print("str_var2 = ", data["str_var2"]) # 运行结果 str_var1 = ab cd ef str_var2 = ab\tcd\nef
1.4. 日期
最后一个常用的基本类型是日期类型。
配置示例:
date_var1 = 2023-09-13T10:08:22 date_var2 = 2023-09-13 date_var3 = 10:08:22
解析示例:
with open("./sample.toml", "rb") as f: data = tomllib.load(f) s = "date_var1 = {} (type: {})".format(data["date_var1"], type(data["date_var1"])) print(s) s = "date_var2 = {} (type: {})".format(data["date_var2"], type(data["date_var2"])) print(s) s = "date_var3 = {} (type: {})".format(data["date_var3"], type(data["date_var3"])) print(s) # 运行结果 date_var1 = 2023-09-13 10:08:22 (type: <class 'datetime.datetime'>) date_var2 = 2023-09-13 (type: <class 'datetime.date'>) date_var3 = 10:08:22 (type: <class 'datetime.time'>)
日期类型可以是完整的年月日时分秒,也可以只有年月日或时分秒。
2. 复合类型
复合类型主要是列表和字典。
2.1. 列表
列表中的元素可以是上面的介绍的任意基本类型。
配置示例:(列表中元素的数据类型可以不同,也可以是一个列表)
lst_var1 = [1, 3.14, "str", 2023-09-13T10:08:22] lst_var2 = [[1, 2], ["abc", "def"]]
解析示例:
with open("./sample.toml", "rb") as f: data = tomllib.load(f) print("lst_var1 = ", data["lst_var1"]) print("lst_var2 = ", data["lst_var2"]) # 运行结果 lst_var1 = [1, 3.14, 'str', datetime.datetime(2023, 9, 13, 10, 8, 22)] lst_var2 = [[1, 2], ['abc', 'def']]
2.2. 字典
配置示例:(字典中值的数据类型可以不同,也可以是一个字典)
[dict_var1] key1 = 1 key2 = 3.14 key3 = "str" key4 = 2023-09-13T10:08:22 [dict_var1.sub_dict] key = "val"
解析示例:
with open("./sample.toml", "rb") as f: data = tomllib.load(f) print("dict_var1 = ", data["dict_var1"]) # 运行结果 dict_var1 = { 'key1': 1, 'key2': 3.14, 'key3': 'str', 'key4': datetime.datetime(2023, 9, 13, 10, 8, 22), 'sub_dict': {'key': 'val'} }
3. 类型组合
如果是写代码的话,列表中嵌入字典或者字典中嵌入列表都非常简单,
但是,配置文件中定义这种复杂的结构就没那么容易了。
TOML
提供了简单的语法来实现复杂类型之间的组合。
3.1. 列表中的字典
配置示例:
[[student]] name = "aaa" age = 15 score = 100 [[student]] name = "bbb" age = 14 score = 89 [[student]] name = "ccc" age = 17 score = 98
解析示例:
with open("./sample.toml", "rb") as f: data = tomllib.load(f) print("students = ", data["student"]) # 运行结果 students = [ {'name': 'aaa', 'age': 15, 'score': 100}, {'name': 'bbb', 'age': 14, 'score': 89}, {'name': 'ccc', 'age': 17, 'score': 98}, ]
3.2. 字典中的列表
字典中嵌入列表比较简单:
[teacher] name = "abc" classes = ["一班", "二班", "三班"]
解析示例:
with open("./sample.toml", "rb") as f: data = tomllib.load(f) print("teacher = ", data["teacher"]) # 运行结果 teacher = { 'name': 'abc', 'classes': ['一班', '二班', '三班'] }
4. TOML的优势
与常用的INI
,JSON
和YAML
等格式的配置文件相比,TOML
诞生的较晚,所以借鉴了它们的优势,采用更加简单直观的语法和缩进格式,使得文件非常易读和易于编辑。
而且TOML
的配置项格式更接近脚本语言,写起来就像代码中定义变量一样。
与传统的INI
配置相比,TOML
在数据类型支持以及语法灵活性方面远远胜出;
与JSON
配置相比,TOML
在简洁性方面远远胜出;
与YAML
配置相比,TOML
在简洁性以及语法灵活性方面远远胜出。
正是因为它的种种优势,现在流行的golang
和rust
语言的项目中,很多都以TOML
作为配置文件。
到此这篇关于Python中Toml配置文件的操作详解的文章就介绍到这了,更多相关Python Toml配置文件内容请搜索好代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持好代码网!