TOML
TOML은 Key: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)