前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TOML语言配置文件入门

TOML语言配置文件入门

原创
作者头像
千万别过来
发布2023-10-26 20:27:22
1.3K2
发布2023-10-26 20:27:22
举报
文章被收录于专栏:推荐算法学习推荐算法学习

前不久发的文章了解学习了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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. TOML简介
  • 2. TOML语法
    • 数据类型
      • 数组
          • 行内表
            • 表数组
              • 注释
                • 多行字符串
                  • 数字格式
                    • 键名
                      • 文件编码与扩展名
                      • 3. TOML在python上的使用
                      • 参考
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档