tomllib, tomlkit로 TOML 다루기

TOML

TOMLKey:Value 형태로 데이터를 매핑하는 파일 형식이다. JSON이나 YAML과 같이 설정 파일에 주로 사용되는 형식이다.

# TOML
[user]
id = 398
name = "DeneV" 

[auth]
admin = true
# JSON
{
  "user": {
    "id": 398,
    "name": "DeneV"
  },
  "auth": {
    "admin": true
  }
}

같은 데이터를 각각 TOML과 JSON으로 표현한 모습이다. 데이터의 구조가 복잡해질수록 TOML이 더 읽기 편하다는 장점이 있다. 추가로 TOML은 JSON과 달리 #으로 주석을 작성할 수 있다는 특징도 있다.

TOML에 대해 간단하게 살펴보면 아래와 같이 여러 자료형의 데이터를 저장할 수 있다. 

string1 = "Hi"  # 문자열
string2 = """
triple quotation marks
"""  # 문자열
integer = 3  # 정수
float = 0.3  # 실수
boolean = true  # 참/거짓
local_date = 2021-11-13  # 날짜
local_time = 03:12:05  # 시간
array = [3, 0, 1]  # 배열

좌변에 작성된 것이 Key, 우변에 작성된 것이 Value인 형태이다. Key 부분은 문자열로 취급된다. 

[table]
data = "..."

[ ] 대괄호로 작성된 부분은 Table의 이름이다. [ ] 아래 작성된 데이터는 Table의 데이터가 된다. 처음에 JSON과 비교한 부분을 보면 이해하기 쉽다. 

# Case 1
[cord]
    [cord.center]
    x = 0
    y = 3

# Case 2
[cord]
center.x = 0
center.y = 3

# Case 3
[cord]
center = {x = 0, y = 3}

위처럼 Table을 중첩으로 사용할 수도 있다. 위 경우는 같은 데이터를 다른 형식으로 표현한 예시이다. 

이 글에서 TOML 자체를 다루지는 않기 때문에 자세한 내용은 realpython.com/python-toml에서 확인할 수 있다. 


tomllib

Python 3.11에 표준 라이브러리로 tomllib가 추가되었다. 사용법은 간단하다.

import tomllib

with open("config.toml", "rb") as f:
    data = tomllib.load(f)

TOML 파일을 "rb" 모드로 읽어온 후, load를 통해 dict 객체로 변환해 준다. 

>>> data = tomllib.load(f)
>>> data
{
  'ex': {
      'float': 0.3, 
      'cord': {'center': {'x': 0, 'y': 3}
  }
}
>>> type(data)
<class 'dict'>

읽어온 정보는 Python의 dict 자료형이다. 따라서 dict에서 값을 가져오는 것과 동일하게 사용하면 된다. 

>>> data = tomllib.load(f)
>>> data["ex"]["cord"]["center"]["x"]
0

글을 쓰는 현재 시점을 기준으로 아직 Python 3.11이 보편화되지 않았기 때문에 이전 버전에 호환되는 라이브러리도 알아둘 필요가 있다. 또 tomllib는 읽기만 가능하기 때문에 수정을 위해서는 tomlkit을 사용한다. 


tomlkit

tomlkit은 외부 라이브러리이기 때문에 설치가 필요하다.

$ pip install tomlkit

읽기는 "r" 모드에서 load로 읽어온다. 

import tomlkit

with open("config.toml", "r") as f:
    data = tomlkit.load(f)  # 읽기

수정은 dict 객체를 수정한 후, dump로 저장한다.

data["user"]["id"] = 13  # 수정

with open("config.toml", "w") as f:
    tomlkit.dump(data, f)  # 저장

자료형

  • tomllib: 데이터에 따라 str, int, float 등 표준 자료형으로 가져온다. 날짜와 시간은 python 표준 라이브러리인 datetime 객체로 정보를 가져온다. 자세한 내용은 공식 문서에 잘 정리되어 있다. 
  • tomlkit: 모든 정보를 tomlkit.items 객체로 불러온다. (i.e. tomlkit.items.String, tomlkit.items.Time)