YAML (YAML Ain't Markup Language): 직관적인 계층 구조를 갖춘 데이터 직렬화 형식으로, 설정 파일, 데이터 교환 등에 적합. Python에서는 pyyaml 라이브러리를 사용하여 작업.
TOML (Tom's Obvious, Minimal Language): 간결하고 명확한 구문을 가진 데이터 직렬화 언어. 주로 설정 파일에 사용되며, Python에서는 toml 라이브러리를 통해 다룰 수 있음.
JSON (JavaScript Object Notation): 데이터 교환의 표준 포맷 중 하나로, 가독성이 뛰어나고 다양한 프로그래밍 언어에서 널리 사용됨. Python의 json 모듈로 처리.
CSON (CoffeeScript Object Notation): JSON의 한 변형으로, CoffeeScript 구문에 영향을 받은 데이터 포맷. 가독성을 높인 JSON의 대안으로 사용되지만 Python에서는 공식적인 표준 라이브러리 지원은 제한적.
XML (eXtensible Markup Language): 태그를 사용해 데이터를 계층적으로 표현하는 마크업 언어. 웹 서비스, 문서 교환 등에 자주 쓰이며, Python에서는 xml.etree.ElementTree 등의 모듈로 파싱 및 생성 가능.
INI (INItialization): 간단한 설정 파일에 사용되는 포맷으로, 섹션과 키-값 쌍으로 구성. Python에서는 configparser 모듈을 이용하여 쉽게 다룰 수 있음.
CSV (Comma-Separated Values): 각 데이터 필드가 쉼표로 구분된 텍스트 파일 형식. 표 형식 데이터 교환에 적합하며, Python에서는 csv 모듈을 통해 읽고 쓸 수 있음.
다양한 데이터 저장/구조화 표현 포맷 중 YAML이 가장 사람이 읽기 쉬운 형태기 때문에 이것을 가장 먼저 소개하려고 합니다.
이에 앞서 YAML의 약자가 YAML Ain't Markup Language 라는 게 조금 신기해서 찾아보았더니, 처음엔 Yet Another Markup Language 였다고 합니다. 그런데 시간이 지나면서 YAML 개발자들은 YAML이 단순한 데이터 표현에 더 중점을 두고 있으며 HTML이나 XML과 같은 전통적인 Markup 언어들과 다르다는 점을 강조하기 위해 YAML Ain't Markup Language 로 그 의미를 변경했다고 하네요.
이 변경은 YAML이 좀 더 사용자 친화적이며, 읽고 쓰기 쉽고, 데이터를 나타내는 데 최적화된 구조임을 강조합니다. YAML은 설정 파일, 데이터 교환 등을 위해 널리 사용되며, JSON처럼 계층적인 데이터 구조를 표현하는 데 적합하지만, 보다 인간이 읽고 쓰기 쉬운 형태를 제공합니다.
YAML 예시
person:
name: 홍길동
email: gildong@example.com
phones:
- type: home
number: 111-1111
- type: work
number: 222-2222
YAML Python에서의 사용
import yaml
# YAML 데이터 로드하기
with open('example.yaml', 'r', encoding='utf-8') as f:
data = yaml.safe_load(f)
print(data['person']['name'])
# YAML 데이터 저장하기
new_data = {
'person': {
'name': '이순신',
'email': 'soonshin@example.com'
}
}
with open('new_data.yaml', 'w', encoding='utf-8') as f:
yaml.dump(new_data, f, allow_unicode=True)
YAML과 비슷한 듯하면서도 뜻은 전혀 다른 TOML도 Tom's Obvious, Minimal Language 라는 약간은 유치한 뜻을 가지고 있는 데이터 표현 방식입니다. TOML은 Tom Preston-Werner에 의해 만들어졌으며 간결하다는(Minimal) 걸 강조하기 위해 Obvious 단어까지 사용했습니다. 아마도 모음을 하나 넣어야 발음하기 쉬워서가 아닐까 추측해 봅니다.
다른 데이터 표현 형식들에 비해 많이 알려진 방식은 아닙니다.
TOML 예시
[person]
name = "홍길동"
email = "gildong@example.com"
[[person.phones]]
type = "home"
number = "111-1111"
[[person.phones]]
type = "work"
number = "222-2222"
TOML Python에서의 사용
import toml
# TOML 데이터 로드하기
with open('example.toml', 'r', encoding='utf-8') as f:
data = toml.load(f)
print(data['person']['name'])
# TOML 데이터 저장하기
new_data = {
'person': {
'name': '이순신',
'email': 'soonshin@example.com',
'phones': [
{'type': 'home', 'number': '333-3333'}
]
}
}
with open('new_data.toml', 'w', encoding='utf-8') as f:
toml.dump(new_data, f)
데이터 저장 방법에 처음 관심을 가지기 시작할 때 처음 접했던 표현 형식이 바로 JSON인데요, 여러 분야에서 가장 널리 사용되는 형식 중 하나입니다.
JSON 예시
{
"person": {
"name": "홍길동",
"email": "gildong@example.com",
"phones": [
{"type": "home", "number": "111-1111"},
{"type": "work", "number": "222-2222"}
]
}
}
JSON Python에서의 사용
import json
# JSON 데이터 로드하기
with open('example.json', 'r', encoding='utf-8') as f:
data = json.load(f)
print(data['person']['name'])
# JSON 데이터 저장하기
new_data = {
"person": {
"name": "이순신",
"email": "soonshin@example.com"
}
}
with open('new_data.json', 'w', encoding='utf-8') as f:
json.dump(new_data, f, ensure_ascii=False, indent=4)
CSON은 JSON의 한 변형으로, CoffeeScript 객체 표기법을 사용합니다. JSON보다 더 간결하고 가독성이 좋다는 장점이 있습니다. CSON은 주석 사용, 덜 엄격한 콤마 처리 등의 특징을 가지고 있습니다.
CoffeeScript라는 이름이 왜 붙었는지 좀 찾아봤지만 창시자인 Jeremy Ashkensa가 특별히 그 이유를 공개한적으로 언급한 적은 없다고 하네요.. 아마도 'Coffee'라는 단어가 주는 익숙하고 편안한 이미지를 활용한 게 아닌가 싶습니다.
CSON 예시
person:
name: "홍길동"
email: "gildong@example.com"
phones: [
{
type: "home"
number: "111-1111"
}
{
type: "work"
number: "222-2222"
}
]
CSON Python에서의 사용
import cson
# CSON 데이터 로드하기
with open('example.cson', 'r', encoding='utf-8') as file:
data = cson.load(file)
print(data['person']['name'])
# CSON 데이터 저장하기
new_data = {
'person': {
'name': '이순신',
'email': 'soonshin@example.com',
'phones': [
{'type': 'mobile', 'number': '333-3333'}
]
}
}
with open('new_data.cson', 'w', encoding='utf-8') as file:
cson.dump(new_data, file, indent=2)
HTML에 익숙하신 분들은 이 구조를 가장 자주 접하셨을 것 같은데요, 다른 표현 방식에 비해 같은 내용을 표현하는데 파일 용량이 큰 편입니다. 하지만 구조가 명확해 한 줄로 써도 동일한 정보를 전달할 수 있으며, 문법 오류가 있어도 해당 부분에 국한되고 나머지 데이터를 처리하는데는 큰 어려움이 없다는 장점이 있습니다.
XML 예시
<person>
<name>홍길동</name>
<email>gildong@example.com</email>
<phones>
<phone type="home">111-1111</phone>
<phone type="work">222-2222</phone>
</phones>
</person>
XML Python에서의 사용
import xml.etree.ElementTree as ET
# XML 데이터 로드하기
tree = ET.parse('example.xml')
root = tree.getroot()
# 데이터 접근하기
for phone in root.find('phones').findall('phone'):
print(phone.attrib['type'], phone.text)
# XML 데이터 생성 및 저장하기
new_person = ET.Element('person')
name = ET.SubElement(new_person, 'name')
name.text = '이순신'
email = ET.SubElement(new_person, 'email')
email.text = 'soonshin@example.com'
tree = ET.ElementTree(new_person)
tree.write('new_person.xml')
마지막으로 가장 오래된 역사를 지닌 INI 입니다. 윈도우를 쓰다보면 한 번씩 봤음직한 확장자죠. 예전엔 이 파일이 메모장으로 열리는 건지조차 몰랐는데.. (사실 잘못 누르면 컴퓨터 고장나는 줄 알았던..) 열어보면 네, 아주 잘 열립니다.
INI 예시
[person]
name = 홍길동
email = gildong@example.com
[home_phone]
type = home
number = 111-1111
[work_phone]
type = work
number = 222-2222
INI Python에서의 사용
import configparser
# INI 데이터 로드하기
config = configparser.ConfigParser()
config.read('example.ini', encoding='utf-8')
name = config['person']['name']
email = config['person']['email']
home_phone = config['home_phone']['number']
print(name, email, home_phone)
# INI 데이터 저장하기
config = configparser.ConfigParser()
config['person'] = {
'name': '이순신',
'email': 'soonshin@example.com'
}
config['home_phone'] = {
'type': 'home',
'number': '333-3333'
}
config['work_phone'] = {
'type': 'work',
'number': '444-4444'
}
with open('new_data.ini', 'w', encoding='utf-8') as configfile:
config.write(configfile)
분명 INI이 마지막이라고 헀는데.. 쿠키 영상이라고 생각하시고 CSV까지 봐 주시면 감사하겠습니다.
하지만 쿠키 영상이 매우 중요한 메시지를 지닐 때가 많듯이 조금은 결을 달리 하지만 CSV도 매우 강력한 (하지만 심플한) 데이터 표현 방식이죠. 일단 우리가 만드는 모든 '표' 형식의 데이터는 CSV로 1:1 대응이 된다고 보시면 됩니다.
이런 CSV의 높은 범용성 때문에 저도 자주 이용합니다.
CSV 예시
name,email,phone
홍길동,gildong@example.com,111-1111
이순신,soonshin@example.com,222-2222
CSV Python에서의 사용
import csv
# CSV 데이터 로드하기
with open('example.csv', 'r', encoding='utf-8') as file:
csv_reader = csv.reader(file)
for row in csv_reader:
print(row)
# CSV 데이터 저장하기
rows = [
['name', 'email', 'phone'],
['홍길동', 'gildong@example.com', '111-1111'],
['이순신', 'soonshin@example.com', '222-2222']
]
with open('new_data.csv', 'w', newline='', encoding='utf-8') as file:
csv_writer = csv.writer(file)
csv_writer.writerows(rows)