ini와 yaml을 사용하면 toml을 배우는 것이 매우 쉽다고 생각합니다. 먼저 예제를 살펴보겠습니다.
import toml config = """ title = "toml 小栗子" [owner] name = "古明地觉" age = 17 place = "东方地灵殿" nickname = ["小五", "少女觉", "觉大人"] [database] host = "127.0.0.1" port = 5432 username = "satori" password = "123456" echo = true [server] [server.v1] api = "1.1" enable = false [server.v2] api = "1.2" enable = true [client] client = [ ["socket", "webservice"], [5555] ] address = [ "xxxx", "yyyy" ] """ # loads:从字符串加载 # load:从文件加载 # dumps:生成 toml 格式字符串 # dump:生成 toml 格式字符串并写入文件中 data = toml.loads(config) print(data) """ { 'title': 'toml 小栗子', 'owner': {'name': '古明地觉', 'age': 17, 'place': '东方地灵殿', 'nickname': ['小五', '少女觉', '觉大人']}, 'database': {'host': '127.0.0.1', 'port': 5432, 'username': 'satori', 'password': '123456', 'echo': True}, 'server': {'v1': {'api': '1.1', 'enable': False}, 'v2': {'api': '1.2', 'enable': True}}, 'client': {'client': [['socket', 'webservice'], [5555]], 'address': ['xxxx', 'yyyy']} } """
toml은 var = value 형식으로 구성되어 있으며, ini와 유사한 섹션도 있습니다. 각 섹션은 사전의 키이고, 키도 사전에 해당합니다. 섹션이 부족하여 초기제목을 적어두어야 하므로 별도의 키로 합니다.
또 다른 요점은 toml이 중첩을 지원한다는 것입니다. server.v1은 v1이 서버에 해당하는 사전의 키이고 v1에 해당하는 값이 여전히 사전임을 의미합니다.
toml은 Python과 매우 유사하게 작성되었습니다.
toml 파일은 대소문자를 구분합니다.
toml 파일은 유효한 UTF-8 인코딩 유니코드 문서여야 합니다.
toml 파일의 공백 문자 Tab 또는 공백이어야 합니다.
toml 파일의 줄 바꿈은 LF 또는 CRLF입니다.
그럼 toml의 데이터 구조를 소개하겠습니다.
toml은 #을 사용하여 주석을 나타냅니다. 예:
# 这是注释 key = "value" # 也是注释
분석하여 결과를 확인할 수 있습니다. 스포일러: 하나의 키-값 쌍만 포함하는 사전을 얻게 됩니다.
기본 블록은 키-값 쌍으로, 등호 왼쪽에 키 이름, 오른쪽에 값이 있으며, 키 이름과 키 주위에 빈 TOML 문서는 무시됩니다. 값. 또한 키, 등호, 값은 같은 줄에 있어야 합니다(일부 값은 여러 줄에 걸쳐 있을 수 있음).
key = "value"
키 이름은 기본 키, 따옴표로 묶인 키 또는 점으로 구분된 키로 나타날 수 있습니다. 기본 키에는 ASCII 문자, 숫자, 밑줄 및 하이픈만 포함할 수 있습니다.
import toml config = """ key = "value" bare_key = "value" bare-key = "value" # 1234 会被当成字符串 1234 = "value" """ data = toml.loads(config) print(data) """ {'key': 'value', 'bare_key': 'value', 'bare-key': 'value', '1234': 'value'} """
Bare Key가 아닌 경우 따옴표로 묶어야 하지만 현재로서는 더 넓은 범위의 키 이름을 사용할 수도 있지만 특별한 시나리오를 제외하고는 Bare Key를 사용하는 것이 가장 좋습니다.
import toml config = """ "127.0.0.1" = "value" "character encoding" = "value" "ʎǝʞ" = "value" 'key2' = "value" 'quoted "value"' = "value" """ data = toml.loads(config) print(data) """ {'127.0.0.1': 'value', 'character encoding': 'value', 'ʎǝʞ': 'value', 'key2': 'value', 'quoted "value"': 'value'} """
참고: 기본 키는 비워둘 수 없지만 빈 따옴표 키는 허용됩니다(권장하지는 않지만).
= "没有键名" # 错误 "" = "空" # 正确但不鼓励 '' = '空' # 正确但不鼓励
그런 다음 점으로 연결된 일련의 기본 키 또는 따옴표로 묶인 키인 점 구분 키가 있습니다. 이를 통해 유사한 속성을 함께 묶을 수 있습니다.
import toml config = """ name = "橙子" physical.color = "橙色" physical.shape = "圆形" site."google.com" = true site.google.com = true a.b.c.d = 123 """ data = toml.loads(config) print(data) """ { 'name': '橙子', 'physical': {'color': '橙色', 'shape': '圆形'}, 'site': {'google.com': True, 'google': {'com': True}}, 'a': {'b': {'c': {'d': 123}}} } """
이 점 구분 기호가 좋고 임베딩이 다음과 같습니다. 구조가 자동으로 구현되며 점 구분 기호 주위의 공백은 무시됩니다.
fruit.name = "香蕉" # 这是最佳实践 fruit. color = "黄色" # 等同于 fruit.color fruit . flavor = "香蕉" # 等同于 fruit.flavor
참고: 동일한 키를 여러 번 정의하는 것은 허용되지 않습니다.
import toml config = """ # name 和 "name" 是等价的 name = "古明地觉" "name" = "古明地恋" """ try: data = toml.loads(config) except toml.decoder.TomlDecodeError as e: print(e) """ Duplicate keys! (line 4 column 1 char 36) """
점으로 구분된 키의 경우에도 마찬가지입니다. 키가 직접 정의되지 않은 한 해당 키와 하위 키 이름에 값을 할당할 수 있습니다.
import toml config = """ fruit.apple.smooth = true# 此时可以继续操作 fruit、fruit.apple,它们都是字典 # 给 fruit 这个字典加一个 key fruit.orange = 2 # 给 fruit.apple 加一个 key fruit.apple.color = "red" """ data = toml.loads(config) print(data) """ { 'fruit': {'apple': {'smooth': True, 'color': 'red'}, 'orange': 2} } """
하지만 다음 작업은 불가능합니다.
# 将 fruit.apple 的值定义为一个整数 fruit.apple = 1 # 但接下来就不合法了,因为整数不能变成字典 fruit.apple.smooth = true # 如果我们设置 fruit.apple = {},那么第二个赋值是可以的 # 没错,我们可以通过 {} 直接创建一个字典
보시다시피 정말 Python과 비슷합니다. 그런 다음 특별한 경우에 대해 이야기해 보겠습니다.
import toml config = """ 3.14 = "pi" "3.14" = "pi" """ data = toml.loads(config) print(data) """ {'3': {'14': 'pi'}, '3.14': 'pi'} """
키가 부동 소수점 숫자인 경우 따옴표로 묶어야 합니다. 그렇지 않으면 점으로 구분된 키로 해석됩니다.
키를 살펴본 후 값을 살펴보겠습니다. 사실 toml의 경우 값은 키보다 훨씬 간단합니다.
문자열을 표현하는 방법에는 기본, 여러 줄 기본, 리터럴, 여러 줄 리터럴의 네 가지 방법이 있습니다.
1) 기본 문자열은 따옴표로 묶이며 이스케이프해야 하는 문자를 제외한 모든 유니코드 문자를 사용할 수 있습니다.
import toml config = """ str = '我是一个字符串,"你可以把我引起来"' """ data = toml.loads(config) print(data) """ {'str': '我是一个字符串,"你可以把我引起来"'} """
여러 줄 문자열은 세 개의 따옴표로 묶을 수 있으며 개행 문자를 포함할 수 있습니다. 그러나 여는 따옴표 뒤의 첫 번째 줄바꿈은 제거되고 다른 공백과 줄바꿈은 유지된다는 점에 유의해야 합니다.
import toml config = """ str = ''' 玫瑰是红色的 紫罗兰是蓝色的 ''' """ data = toml.loads(config) print(data) """ {'str': '玫瑰是红色的\n紫罗兰是蓝色的\n'} """
여기의 따옴표는 큰따옴표나 작은따옴표일 수 있습니다.
정수는 순수 숫자입니다. 양수 앞에는 더하기 기호가 붙을 수 있고, 음수에는 빼기 기호가 앞에 붙을 수 있습니다.
import toml config = """ int1 = +99 int2 = 42 int3 = 0 int4 = -17 # 对于大数,可以在数字之间用下划线来增强可读性 # 每个下划线两侧必须至少有一个数字。 int5 = 1_000 int6 = 5_349_221 int7 = 53_49_221 # 印度记数体系分组 int8 = 1_2_3_4_5 # 无误但不鼓励 """ data = toml.loads(config) print(data) """ {'int1': 99, 'int2': 42, 'int3': 0, 'int4': -17, 'int5': 1000, 'int6': 5349221, 'int7': 5349221, 'int8': 12345} """
하지만 참고: 0 자체를 제외하고 숫자는 0으로 시작할 수 없습니다. 접두사가 없는 0, -0 및 +0은 동일합니다. 음이 아닌 정수 값은 16진수, 8진수, 2진수로도 표현될 수 있습니다.
# 带有 `0x` 前缀的十六进制,大小写均可 hex1 = 0xDEADBEEF hex2 = 0xdeadbeef hex3 = 0xdead_beef # 带有 `0o` 前缀的八进制 oct1 = 0o01234567 oct2 = 0o755 # 对于表示 Unix 文件权限很有用 # 带有 `0b` 前缀的二进制 bin1 = 0b11010110
부동 소수점 수는 정수 부분과 소수 부분으로 구성될 수도 있고 지수 부분으로 구성될 수도 있습니다. 정수 및 분수 부분은 십진 정수 값과 동일한 규칙을 따릅니다. 소수 부분과 지수 부분이 모두 있는 경우 소수 부분이 지수 부분보다 앞에 와야 합니다.
import toml config = """ # 小数 flt1 = +1.0 flt2 = 3.1415 flt3 = -0.01 # 指数 flt4 = 5e+22 flt5 = 1e06 flt6 = -2E-2 flt7 = 6.626e-34 """ data = toml.loads(config) print(data) """ {'flt1': 1.0, 'flt2': 3.1415, 'flt3': -0.01, 'flt4': 5e+22, 'flt5': 1000000.0, 'flt6': -0.02, 'flt7': 6.626e-34} """
소수 부분은 소수점 뒤에 하나 이상의 숫자가 오고 지수 부분은 E(대문자 또는 소문자) 뒤에 정수 부분이 옵니다(십진수 정수 값과 동일한 규칙을 따르지만 앞에 0이 포함될 수 있음). ). 소수점을 사용하는 경우 각 변의 최소 한 자리 숫자 바로 옆에 있어야 합니다.
# 非法的浮点数 invalid_float_1 = .7 invalid_float_2 = 7. invalid_float_3 = 3.e+20
정수와 마찬가지로 밑줄도 가독성을 높이기 위해 사용할 수 있으며 각 밑줄은 최소한 한 자리 이상의 숫자로 묶어야 합니다.
flt8 = 224_617.445_991_228
부동 소수점 값 -0.0 및 +0.0이 유효하며 IEEE 754를 준수해야 합니다. 특별한 부동 소수점 값도 표현할 수 있습니다:
# 无穷 sf1 = inf # 正无穷 sf2 = +inf # 正无穷 sf3 = -inf # 负无穷 # 非数 sf4 = nan # 是对应信号非数码还是静默非数码,取决于实现 sf5 = +nan # 等同于 `nan` sf6 = -nan # 正确,实际码取决于实现
부울 값도 이와 같지만 소문자입니다.
bool1 = true bool2 = false
는 일반 날짜/시간이거나 ISO-8859-1 형식을 따르는 날짜일 수 있습니다.
import toml config = """ dt1 = 2020-01-01T12:33:22+00:00 dt2 = 2020-11-12 12:11:33 dt3 = 2020-11-23 """ data = toml.loads(config) print(data) """ {'dt1': datetime.datetime(2020, 1, 1, 12, 33, 22, tzinfo=...), 'dt2': datetime.datetime(2020, 11, 12, 12, 11, 33), 'dt3': datetime.date(2020, 11, 23)} """
구문은 Python의 목록과 유사합니다.
import toml config = """ # 每个数组里面的元素类型要一致 integers = [1, 2, 3] colors = ["红", "黄", "绿"] nested_array_of_ints = [[1, 2], [3, 4, 5]] nested_mixed_array = [[1, 2], ["a", "b", "c"]] numbers = [0.1, 0.2, 0.5] """ data = toml.loads(config) print(data) """ {'colors': ['红', '黄', '绿'], 'integers': [1, 2, 3], 'nested_array_of_ints': [[1, 2], [3, 4, 5]], 'nested_mixed_array': [[1, 2], ['a', 'b', 'c']], 'numbers': [0.1, 0.2, 0.5]} """
배열은 여러 줄에 걸쳐 있을 수 있으며 배열의 마지막 값 뒤에 터미널 쉼표(후행 쉼표라고도 함)가 있을 수 있습니다.
import toml config = """ integers2 = [ 1, 2, 3 ] integers3 = [ 1, 2, # 这是可以的 ] """ data = toml.loads(config) print(data) """ {'integers2': [1, 2, 3], 'integers3': [1, 2]} """
Table은 이니의 한 부분이라고 생각하시면 됩니다.
import toml config = """ # 表名的定义规则与键名相同 # 解析之后得到的大字典中就有 "table-1" 这个 key # 并且其 value 也是一个表,在它下方 # 直至下一个表头或文件结束,都是这个表内部的键值对 [table-1] key1 = "some string" key2 = 123 [table-2] key1 = "another string" key2 = 456 """ data = toml.loads(config) print(data) """ {'table-1': {'key1': 'some string', 'key2': 123}, 'table-2': {'key1': 'another string', 'key2': 456}} """
하지만 이전에 이와 유사한 구조를 구현한 적이 있습니다. 예, 점 구분 기호입니다.
import toml config = """ # 所以 other-table-1 和 table-1 是等价的 # other-table-2 和 table-2 是等价的 other-table-1.key1 = "some string" other-table-1.key2 = 123 other-table-2.key1 = "another string" other-table-2.key2 = 456 [table-1] key1 = "some string" key2 = 123 [table-2] key1 = "another string" key2 = 456 """ data = toml.loads(config) print(data) """ {'other-table-1': {'key1': 'some string', 'key2': 123}, 'other-table-2': {'key1': 'another string', 'key2': 456}, 'table-1': {'key1': 'some string', 'key2': 123}, 'table-2': {'key1': 'another string', 'key2': 456}} """
不过注意:我们必须要把 other-table-1 和 other-table-2 定义在上面,如果我们定义在下面看看会有什么后果:
import toml config = """ [table-1] key1 = "some string" key2 = 123 [table-2] key1 = "another string" key2 = 456 other-table-1.key1 = "some string" other-table-1.key2 = 123 other-table-2.key1 = "another string" other-table-2.key2 = 456 """ data = toml.loads(config) print(data) """ { 'table-1': {'key1': 'some string', 'key2': 123}, 'table-2': {'key1': 'another string', 'key2': 456, 'other-table-1': {'key1': 'some string', 'key2': 123}, 'other-table-2': {'key1': 'another string', 'key2': 456}} } """
你可能已经猜到了,它们被视为了“table-2”对应的字典键。此外我们还可以将上面两种方式结合起来:
import toml config = """ # [] 里面的不再是一个普通的键,而是点分隔键 # 另外键名周围的空格会被忽略,但是最好不要有 [dog . "tater.man"] type.name = "哈巴狗" """ data = toml.loads(config) print(data) """ { 'dog': {'tater.man': {'type': {'name': '哈巴狗'}}} } """
表的里面也是可以没有键值对的:
import toml config = """ [x.y.z.w.a.n] [x.m] [x.n] [x] a.b.c = "xxx" """ data = toml.loads(config) print(data) """ {'x': { 'a': {'b': {'c': 'xxx'}}, 'm': {}, 'n': {}, 'y': {'z': {'w': {'a': {'n': {}}}}} } } """
总的来说还是蛮强大的,但是要注意:不能重复定义。
行内表提供了一种更为紧凑的语法来表示表,因为上面每一个键值对都需要单独写一行,比如:
[table1] a = 1 b = 2 c = 3 # 最终可以得到 # {'table1': {'a': 1, 'b': 2, 'c': 3}}
但是除了上面的表达方式之外,我们还可以采用行内表:
import toml config = """ # 和 Python 字典的表示方式略有不同 # 并且也支持多种 key table1 = {a = 1, b = "二", c.a = "3"} table2 = {c."b c".d = "4"} """ data = toml.loads(config) print(data) """ { 'table1': {'a': 1, 'b': '二', 'c': {'a': '3'}}, 'table2': {'c': {'b c': {'d': '4'}}} } """
然后来看看数组和表的结合:
import toml config = """ [name1] girl = "古明地觉" [[name2]] girl = "古明地恋" [name3] [[name4]] """ data = toml.loads(config) print(data) """ {'name1': {'girl': '古明地觉'}, 'name2': [{'girl': '古明地恋'}], 'name3': {}, 'name4': [{}]} """
当使用 [[]] 的时候,相当于在 [] 的基础上套上一层列表。任何对表数组的引用都会指向该数组中最近定义的表元素,这使得我们能够在最近的表内定义子表甚至子表数组。
我们再举个更复杂的例子:
import toml config = """ [[fruits]] name = "苹果" # 会操作 [] 里面最近定义的 {} [fruits.physical] color = "红色" shape = "圆形" [[fruits.varieties]] # 嵌套表数组 name = "蛇果" [[fruits.varieties]] name = "澳洲青苹" [[fruits]] name = "香蕉" [[fruits.varieties]] name = "车前草" """ data = toml.loads(config) print(data) """ { 'fruits': [ { 'name': '苹果', 'physical': {'color': '红色', 'shape': '圆形'}, 'varieties': [{'name': '蛇果'}, {'name': '澳洲青苹'}] }, { 'name': '香蕉', 'varieties': [{'name': '车前草'}] } ] } """
很明显这种定义不是很常用,配置文件应该要非常直观才对,但这已经不是很好理解了。
위 내용은 Python을 사용하여 toml 구성 파일을 구문 분석하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!