0
点赞
收藏
分享

微信扫一扫

toml简单介绍

凉夜lrs 2023-04-19 阅读 90

现在很多软件配置文件都是.toml格式的了,所以作为运维人员,很有必要了解下toml。

官网网址

https://toml.io/cn/

概念

为人而生的配置文件格式。

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 <foo@example.com>",
  { name = "Baz Qux", email = "bazqux@example.com", 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格式作为配置文件教多

举报

相关推荐

0 条评论