TOML语言配置文件入门

2023-10-26 20:27:22 浏览数 (2)

前不久发的文章了解学习了protobuf:Python Protobuf入门

最近在配置算子的时候,一直用着一种配置文件,而且有着自己奇奇怪怪的语法,起初没想多以为是公司自己独创的语言。后来经提醒发现是TOML语言,由于没怎么做过开发,之前从来没听说过这个语言,趁此机会了解学习一下。

1. TOML简介

TOML(Tom's Obvious, Minimal Language),简单说就是类似YAML、JSON的一种配置文件语法。它由 Tom Preston-Werner 创建,他是 GitHub 的创始人之一。从名字可以看出,真的取的很随意,我个人甚至觉得TOML都可以理解成是Tom's Language(hhhhhh)

TOML 的主要特点大概可以概括为:

  1. 易于阅读:TOML 文件具有清晰的结构和简洁的语法,使得人们可以轻松阅读和理解配置文件的内容。
  2. 易于编写:TOML 语法简单直观,用户可以轻松创建和修改配置文件。
  3. 强类型:TOML 支持多种数据类型,如整数、浮点数、布尔值、字符串、日期和时间等。
  4. 结构化: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
  • 布尔值:truefalse。例如: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:56Ztimestamp = 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 的表,其中包含 serverport 键,以及一个名为 credentials 的子表,其中包含 usernamepassword 键。

对应成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 的数组表,其中包含两个具有相同结构(nameage 键)的表。

对应的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,一般都会自带,如果没有的话可以使用:

代码语言:javascript复制
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

0 人点赞