Python Toml:现代化的配置文件

TOML是一种用于配置文件的轻量级、易读的数据序列化格式。

由Tom Preston-Werner创建,旨在成为一种简单直观的配置文件语言,适用于任何编程语言环境。

TOML支持多种数据类型,包括字符串、整数、浮点数、布尔值、日期时间、数组和嵌套表等等。
TOML通常用于配置应用程序或软件的设置,例如配置数据库连接信息、网络参数、日志级别等。

在许多编程语言中,都有第三方库或原生支持,用于解析和生成TOML格式的配置文件。
Python3.11版本开始,原生支持TOML的解析,不需要再安装第三方的库。

1. 基本类型

配置项的值在TOML中也像在JSON中一样,是可以有类型的。

它说支持的基本类型主要有布尔值数值 (整数,浮点数),字符串日期等几种。

1.1. 布尔值

python中的TOML模块可以加载toml格式的字符串 ,或者toml文件的文件流

python 复制代码
# -*- 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

toml 复制代码
bool_var1 = false
bool_var2 = true

1.2. 数值

数值类型分为整数浮点数 两种。
整型除了10进制,也可以用16进制,8进制和2进制。

toml 复制代码
# 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进制。

python 复制代码
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

浮点型的各种配置示例:

toml 复制代码
float_var1 = 3.1415
float_var2 = -0.01
float_var3 = 5e+22
float_var4 = -2E-2
float_var5 = 6.626e-34

解析示例:各种格式的float写法都可以解析。

python 复制代码
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. 字符串

对于字符串类型的配置项,支持单行多行 字符串。

配置文件示例:

toml 复制代码
str_single = "abcdefg"
str_multi = """ab
cd
ef
"""

解析示例:

python 复制代码
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

字符串的配置除了单行多行 以外,还有单引号双引号的区别。

  • 单引号字符串:原样显示字符串内容
  • 双引号字符串:解析字符串中的转义符
toml 复制代码
str_var1 = "ab\tcd\nef"
str_var2 = 'ab\tcd\nef'

解析之后:

python 复制代码
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. 日期

最后一个常用的基本类型是日期 类型。

配置示例:

toml 复制代码
date_var1 = 2023-09-13T10:08:22
date_var2 = 2023-09-13
date_var3 = 10:08:22

解析示例:

python 复制代码
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. 列表

列表中的元素可以是上面的介绍的任意基本类型

配置示例:(列表中元素的数据类型可以不同,也可以是一个列表)

toml 复制代码
lst_var1 = [1, 3.14, "str", 2023-09-13T10:08:22]
lst_var2 = [[1, 2], ["abc", "def"]]

解析示例:

python 复制代码
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. 字典

配置示例:(字典中值的数据类型可以不同,也可以是一个字典)

toml 复制代码
[dict_var1]
key1 = 1
key2 = 3.14
key3 = "str"
key4 = 2023-09-13T10:08:22

[dict_var1.sub_dict]
key = "val"

解析示例:

python 复制代码
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. 列表中的字典

配置示例:

toml 复制代码
[[student]]
name = "aaa"
age = 15
score = 100

[[student]]
name = "bbb"
age = 14
score = 89

[[student]]
name = "ccc"
age = 17
score = 98

解析示例:

python 复制代码
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. 字典中的列表

字典中嵌入列表比较简单:

toml 复制代码
[teacher]
name = "abc"
classes = ["一班", "二班", "三班"]

解析示例:

python 复制代码
with open("./sample.toml", "rb") as f:
    data = tomllib.load(f)

print("teacher = ", data["teacher"])

# 运行结果
teacher =  {
    'name': 'abc', 
    'classes': ['一班', '二班', '三班']
}

4. TOML的优势

与常用的INIJSONYAML等格式的配置文件相比,TOML诞生的较晚,所以借鉴了它们的优势,

采用更加简单直观的语法和缩进格式,使得文件非常易读和易于编辑。

而且TOML的配置项格式更接近脚本语言,写起来就像代码中定义变量一样。

与传统的INI配置相比,TOML数据类型支持 以及语法灵活性 方面远远胜出;

JSON配置相比,TOML简洁性 方面远远胜出;

YAML配置相比,TOML简洁性 以及语法灵活性方面远远胜出。

正是因为它的种种优势,现在流行的golangrust语言的项目中,很多都以TOML作为配置文件。

相关推荐
牛顿喜欢吃苹果3 分钟前
linux创建虚拟串口
python
路在脚下@4 分钟前
Spring如何处理循环依赖
java·后端·spring
-Mr_X-10 分钟前
FFmpeg在python里推流被处理过的视频流
python·ffmpeg
一个不秃头的 程序员26 分钟前
代码加入SFTP JAVA ---(小白篇3)
java·python·github
susu108301891131 分钟前
python实现根据搜索关键词爬取某宝商品信息
爬虫·python
喜欢猪猪1 小时前
Java技术专家视角解读:SQL优化与批处理在大数据处理中的应用及原理
android·python·adb
海绵波波1071 小时前
flask后端开发(1):第一个Flask项目
后端·python·flask
林的快手1 小时前
209.长度最小的子数组
java·数据结构·数据库·python·算法·leetcode
从以前1 小时前
准备考试:解决大学入学考试问题
数据结构·python·算法
Ven%2 小时前
如何修改pip全局缓存位置和全局安装包存放路径
人工智能·python·深度学习·缓存·自然语言处理·pip