前不久发的文章了解学习了protobuf:Python Protobuf入门
最近在配置算子的时候,一直用着一种配置文件,而且有着自己奇奇怪怪的语法,起初没想多以为是公司自己独创的语言。后来经提醒发现是TOML语言,由于没怎么做过开发,之前从来没听说过这个语言,趁此机会了解学习一下。
1. TOML简介
TOML(Tom's Obvious, Minimal Language),简单说就是类似YAML、JSON的一种配置文件语法。它由 Tom Preston-Werner 创建,他是 GitHub 的创始人之一。从名字可以看出,真的取的很随意,我个人甚至觉得TOML都可以理解成是Tom's Language(hhhhhh)
TOML 的主要特点大概可以概括为:
- 易于阅读:TOML 文件具有清晰的结构和简洁的语法,使得人们可以轻松阅读和理解配置文件的内容。
- 易于编写:TOML 语法简单直观,用户可以轻松创建和修改配置文件。
- 强类型:TOML 支持多种数据类型,如整数、浮点数、布尔值、字符串、日期和时间等。
- 结构化:TOML 支持键值对、数组、表(类似于 JSON 对象)和内联表等结构,使得配置文件可以表示复杂的数据结构。
相比于JSON的一堆括号,以及YAML头疼的缩进,TOML确实很友好,写起来会舒服很多。
2. TOML语法
废话不多说先举个例子:
代码语言:javascript复制title = "示例"
[owner]
name = "张三"
dob = 1990-01-01T12:34:56Z # 日期和时间
[database]
server = "192.168.1.1"
ports = [8001, 8002, 8003]
connection_max = 5000
enabled = true
[servers]
[servers.alpha]
ip = "10.0.0.1"
dc = "北京"
[servers.beta]
ip = "10.0.0.2"
dc = "上海"
[[person]]
name = "张三"
age = 30
[[person]]
name = "李四"
age = 25
[[person]]
name = "王五"
可以使用在线toml转json:https://www.convertjson.com/toml-to-json.htm
如果转换成JSON格式的话,大概是这样:
代码语言:javascript复制{
"title": "示例",
"owner": {
"name": "张三",
"dob": "1990-01-01T12:34:56.000Z"
},
"database": {
"server": "192.168.1.1",
"ports": [
8001,
8002,
8003
],
"connection_max": 5000,
"enabled": true
},
"servers": {
"alpha": {
"ip": "10.0.0.1",
"dc": "北京"
},
"beta": {
"ip": "10.0.0.2",
"dc": "上海"
}
},
"person": [
{
"name": "张三",
"age": 30
},
{
"name": "李四",
"age": 25
},
{
"name": "王五"
}
]
}
TOML 支持多种数据类型和结构,这使得它非常适合在各种应用程序中作为配置文件格式使用。下面将详细介绍 TOML 的语法和特性:
数据类型
TOML 支持以下基本数据类型:
- 字符串:使用双引号(")括起来的一系列字符。例如:
name = "张三"
- 整数:十进制整数。例如:
age = 30
- 浮点数:十进制浮点数。例如:
pi = 3.14159
- 布尔值:
true
或false
。例如:enabled = true
- 日期:表示日期的 YYYY-MM-DD 格式。例如:
dob = 1990-01-01
- 时间:表示时间的 hh:mm:ss 格式。例如:
start_time = 12:34:56
- 日期时间:表示日期和时间的 YYYY-MM-DDThh:mm:ss 格式。例如:
timestamp = 2023-10-26T12:34:56
- 日期时间(带时区):表示带有时区偏移的日期和时间。例如:
timestamp = 2022-01-01T12:34:56Z
或timestamp = 2023-10-26T12:34:56 08:00
,参考RFC 3339 格式的日期时刻
数组
TOML 支持数组,即一系列相同类型的值。数组用方括号([ ])表示,值之间用逗号分隔。例如:
代码语言:javascript复制numbers = [1, 2, 3, 4, 5]
names = ["张三", "李四", "王五"]
表
表是 TOML 中的键值对集合,类似于 JSON 中的对象。表用方括号([ ])表示,并使用点号(.)表示层级关系。例如:
代码语言:javascript复制[database]
server = "192.168.1.1"
port = 3306
[database.credentials]
username = "user"
password = "password"
这将创建一个名为 database
的表,其中包含 server
和 port
键,以及一个名为 credentials
的子表,其中包含 username
和 password
键。
对应成JSON就是:
代码语言:javascript复制{
"database": {
"server": "192.168.1.1",
"port": 3306,
"credentials": {
"username": "user",
"password": "password"
}
}
}
行内表
内联表是一种简洁的表示表的方法,适用于简单的键值对集合。内联表用花括号({ })表示,键值对之间用逗号分隔。例如:
代码语言:javascript复制point = { x = 1, y = 2 }
对应的JSON是:
代码语言:javascript复制{
"point": {
"x": 1,
"y": 2
}
}
表数组
数组表表示一系列具有相同结构的表。数组表使用两个方括号([[ ]])表示。例如:
代码语言:javascript复制[[person]]
name = "张三"
age = 30
[[person]]
name = "李四"
age = 25
这将创建一个名为 person
的数组表,其中包含两个具有相同结构(name
和 age
键)的表。
对应的JSON是:
代码语言:javascript复制{
"person": [
{
"name": "张三",
"age": 30
},
{
"name": "李四",
"age": 25
}
]
}
注释
TOML 支持单行注释。注释以井号(#)开头,直到行尾,跟python很像。例如:
代码语言:javascript复制# 这是一个注释
name = "张三" # 这也是一个注释
多行字符串
TOML 支持多行字符串,这在配置文件中表示较长的文本时非常有用。多行字符串使用三个双引号(""")表示。例如:
代码语言:javascript复制long_text = """
啊吧啊吧啊吧啊吧
啊吧啊吧
啊
"""
数字格式
TOML 中的整数和浮点数支持多种格式。例如,整数可以用十进制、八进制、十六进制和二进制表示:
代码语言:javascript复制decimal = 42
octal = 0o52
hexadecimal = 0x2A
binary = 0b101010
浮点数支持科学记数法表示:
代码语言:javascript复制scientific = 1.2e3
键名
TOML 中的键名可以使用以下格式:
- 简单键名:由字母、数字、下划线组成,不能以数字开头。例如:
key_name
- 带引号的键名:由双引号括起来的任意字符串。例如:
"Key Name with Spaces"
文件编码与扩展名
TOML 文件应使用 UTF-8 编码,扩展名应使用 .toml
扩展名
3. TOML在python上的使用
在Python中,可以使用第三方库toml
来解析和生成TOML文件。如果按照了anaconda,一般都会自带,如果没有的话可以使用:
pip install toml
conda install toml (conda使用)
然后,可以使用以下代码来解析和生成TOML文件:
代码语言:javascript复制import toml
# 解析TOML文件
with open("test.toml", "r", encoding="utf-8") as file:
config = toml.load(file)
print(config)
# 修改配置
config["database"]["enabled"] = False
# 生成新的TOML文件
with open("new_test.toml", "w") as file:
toml.dump(config, file)
这里注意,读取toml文件后,会产生一个字典变量。接下来,只需要按照python的字典操作修改和保存文件即可。
参考
https://github.com/LongTengDao/TOML/blob/龙腾道-译/toml-v1.0.0.md
https://zhuanlan.zhihu.com/p/656723657