现在很多软件配置文件都是.toml格式的了,所以作为运维人员,很有必要了解下toml。
官网网址
概念
为人而生的配置文件格式。
TOML 旨在成为一个语义明显且易于阅读的最小化配置文件格式。TOML 被设计成可以无歧义地映射为哈希表。TOML 应该能很容易地被解析成各种语言中的数据结构。
TOML 旨在成为一个最小化配置文件格式,它:
- 语义明显易于阅读
- 能无歧义地映射为哈希表
- 易于解析成各种语言中的数据结构
TOML 已经拥有大多数当今使用的最流行的编程语言的实现:C、C#、C++、Clojure、Dart、Elixir、Erlang、Go、Haskell、Java、Javascript、Lua、Objective-C、Perl、PHP、Python、Ruby、Swift、Scala……以及更多。
常用语法
- TOML 是大小写敏感的。
- TOML 文件必须是合法的 UTF-8 编码的 Unicode 文档。
- 空白是指制表符(0x09)或空格(0x20)。
- 换行是指 LF(0x0A)或 CRLF(0x0D 0x0A)
注释
# 这是一个全行注释
key = "value" # 这是一个行末注释
another = "# 这不是一个注释"
除制表符以外的控制字符(U+0000 至 U+0008,U+000A 至 U+001F,U+007F)不允许出现在注释中
键值对
TOML 文档最基本的构成区块是键值对。
键名在等号的左边而值在右边。键名和键值周围的空白会被忽略。键、等号和值必须在同一行(不过有些值可以跨多行)。
key = "value"
- 字符串
- 整数
- 浮点数
- 布尔值
- 坐标日期时刻
- 各地日期时刻
- 各地日期
- 各地时刻
- 数组
- 内联表
数组
数组是内含值的方括号。
空白会被忽略。
子元素由逗号分隔。
数组可以包含与键值对所允许的相同数据类型的值。
可以混合不同类型的值。
integers = [ 1, 2, 3 ]
colors = [ "红", "黄", "绿" ]
nested_array_of_ints = [ [ 1, 2 ], [3, 4, 5] ]
nested_mixed_array = [ [ 1, 2 ], ["a", "b", "c"] ]
string_array = [ "所有的", '字符串', """是相同的""", '''类型''' ]
# 允许混合类型的数组
numbers = [ 0.1, 0.2, 0.5, 1, 2, 5 ]
contributors = [
"Foo Bar <[email protected]>",
{ name = "Baz Qux", email = "[email protected]", url = "https://example.com/bazqux" }
]
#数组可以跨行。
#数组的最后一个值后面可以有终逗号(也称为尾逗号)。
#值、逗号、结束括号前可以存在任意数量的换行和注释。
#数组值和逗号之间的缩进被作为空白对待而被忽略。
integers2 = [
1, 2, 3
]
integers3 = [
1,
2, # 这是可以的
]
表
表(也被称为哈希表或字典)是键值对的集合。
它们由表头定义,连同方括号作为单独的行出现。
看得出表头不同于数组,因为数组只有值。
#在它下方,直至下一个表头或文件结束,都是这个表的键值对。
#表不保证保持键值对的指定顺序。
[table-1]
key1 = "some string"
key2 = 123
[table-2]
key1 = "another string"
key2 = 456
#表名的规则与键名相同
[dog."tater.man"]
type.name = "pug"
#等同于json
{ "dog": { "tater.man": { "type": { "name": "pug" } } } }
内联表
内联表提供了一种更为紧凑的语法来表示表。它们对于分组数据特别有用,否则这些数据很快就会变得冗长。内联表被完整地定义在花括号之中:{ 和 }。 括号中,可以出现零或更多个以逗号分隔的键值对。键值对采取与标准表中的键值对相同的形式。什么类型的值都可以,包括内联表。
内联表得出现在同一行内。内联表中,最后一对键值对后不允许终逗号(也称为尾逗号)。不允许花括号中出现任何换行,除非在值中它们合法。即便如此,也强烈不建议把一个内联表搞成纵跨多行的样子。如果你发现自己真的需要,那意味着你应该使用标准表
name = { first = "Tom", last = "Preston-Werner" }
point = { x = 1, y = 2 }
animal = { type.name = "pug" }
#等价于
[name]
first = "Tom"
last = "Preston-Werner"
[point]
x = 1
y = 2
[animal]
type.name = "pug"
表数组
这可以通过把表名写在双方括号里的表头来表示。
表头的第一例定义了这个数组及其首个表元素,而后续的每个则在该数组中创建并定义一个新的表元素。
这些表按出现顺序插入该数组。
[[products]]
name = "Hammer"
sku = 738594937
[[products]] # 数组里的空表
[[products]]
name = "Nail"
sku = 284758393
color = "gray"
#等价于json
{
"products": [
{ "name": "Hammer", "sku": 738594937 },
{ },
{ "name": "Nail", "sku": 284758393, "color": "gray" }
]
}
#任何对表数组的引用都指向该数组里最近定义的表元素。
#这允许你在最近的表内定义子表,甚至子表数组。
[[fruits]]
name = "apple"
[fruits.physical] # 子表
color = "red"
shape = "round"
[[fruits.varieties]] # 嵌套表数组
name = "red delicious"
[[fruits.varieties]]
name = "granny smith"
[[fruits]]
name = "banana"
[[fruits.varieties]]
name = "plantain"
#等价于json
{
"fruits": [
{
"name": "apple",
"physical": {
"color": "red",
"shape": "round"
},
"varieties": [
{ "name": "red delicious" },
{ "name": "granny smith" }
]
},
{
"name": "banana",
"varieties": [
{ "name": "plantain" }
]
}
]
}
解析
关于toml格式的语法解析,参考以下
https://github.com/toml-lang/toml/wiki
python解析
3.11版本安装tomli库
pip install tomli
解析toml
import tomli
#解析字符串
toml_str = """
[[players]]
name = "Lehtinen"
number = 26
[[players]]
name = "Numminen"
number = 27
"""
toml_dict = tomli.loads(toml_str)
assert toml_dict == {
"players": [{"name": "Lehtinen", "number": 26}, {"name": "Numminen", "number": 27}]
}
#解析配置文本
import tomli
with open("path_to_file/conf.toml", "rb") as f:
toml_dict = tomli.load(f)
go解析
使用go-toml模块
import "github.com/pelletier/go-toml/v2"
//定义配置文件结构体
type MyConfig struct {
Version int
Name string
Tags []string
}
//解析
doc := `
version = 2
name = "go-toml"
tags = ["go", "toml"]
`
var cfg MyConfig
err := toml.Unmarshal([]byte(doc), &cfg)
if err != nil {
panic(err)
}
fmt.Println("version:", cfg.Version)
fmt.Println("name:", cfg.Name)
fmt.Println("tags:", cfg.Tags)
// Output:
// version: 2
// name: go-toml
// tags: [go toml]
//编码
cfg := MyConfig{
Version: 2,
Name: "go-toml",
Tags: []string{"go", "toml"},
}
b, err := toml.Marshal(cfg)
if err != nil {
panic(err)
}
fmt.Println(string(b))
// Output:
// Version = 2
// Name = 'go-toml'
// Tags = ['go', 'toml']
目前主要是go语言中使用toml格式作为配置文件教多
标签:name,TOML,介绍,键值,数组,简单,go,toml From: https://blog.51cto.com/u_11555417/6205967