데이터 형식 비교
데이터 저장 방식은 주로 세 가지로 구분됩니다:
- 설정 파일형: ini, properties 등으로 단순 변수 저장에 적합하며 최대 두단계 깊이만 지원
- 행렬형: CSV, 엑셀 등 대량 데이터 저장에 사용되며 계층 구조를 표현하지 못함
- 계층형: JSON, YAML 등 복잡한 구조 표현 가능하나 대량 데이터 처리에는 부적합
YAML은 JSON과 호환되며 간결하고 유연한 구조를 제공합니다. 특히 다중 레벨 데이터 표현에 강점이 있으며, 파이썬의 딕셔너리 타입으로 변환할 수 있는 특징을 가집니다.
YAML 기초
YAML(Ain't Markup Language)은 XML 대신 데이터 중심의 형식입니다. 대소문자 구분이 있으며 들여쓰기로 계층 구조를 표현합니다. 지원하는 데이터 유형은 객체(딕셔너리), 배열(리스트), 문자열, 숫자, 불린, null 등이며 JSON보다 구조 문법이 간단합니다. JSON의 따옴표, 괄호 등을 생략할 수 있고 주석, 타입 변환, 줄 바꿈 처리 등 다양한 기능을 지원합니다.
기본 문법
- 객체:
key: value형태로 작성(콜론 뒤 공백 필수),{}또는"key": "value"로도 표현 가능 - 배열:
- value형식으로 작성(- 뒤 공백 필수),[value1,value2,...]또는["value1", "value2", ...]사용 가능 - 문자열:
'abc'또는"abc" - 숫자:
123또는123.45 - 불린:
true/false,TRUE/FALSE,True/False,on/off등 모두 유효 - null:
null,~사용 가능
예시 파일 config.yaml:
# 샘플 YAML 파일
이름: Cactus
나이: 18
기술:
-
- 파이썬
- 3
-
- 자바
- 5
블로그: true
연인: ~
대응하는 JSON 형식:
{
"이름": "Cactus",
"나이": 18,
"기술": [
["파이썬", 3],
["자바", 5]
],
"블로그": true,
"연인": null
}
자료형 변환
!!str, !!float 등으로 명시적 형식 지정이 가능합니다:
- !!float 3
- !!str 4
- !!str true
JSON 형식으로 변환 시:
[
3.0,
"4",
"true"
]
다중 텍스트 처리
|: 줄바꿈 유지>: 텍스트 합치기
예시:
a: |
안녕하세요
잘가세요
b: >
안녕하세요
안녕히 가세요
JSON 결과:
{
"a": "안녕하세요\n잘가세요\n",
"b": "안녕하세요 안녕히 가세요"
}
앵커 및 참조
&앵커명으로 항목 선언 후 *앵커명으로 참조 가능하며 <<: *앵커명으로 데이터 병합도 수행 가능합니다:
사용자:
- &zs
이름: 장삼
비밀번호: !!str 123456
- &ls
이름: 이사
비밀번호: abcdefg
테스트1:
로그인: *zs
테스트2:
사용자:
<<: *ls
나이: 20
JSON 변환 결과:
{
"사용자": [
{"이름": "장삼", "비밀번호": "123456"},
{"이름": "이사", "비밀번호": "abcdefg"}
],
"테스트1": {"로그인": {"이름": "장삼", "비밀번호": "123456"}},
"테스트2": {
"사용자": {
"이름": "이사",
"비밀번호": "abcdefg",
"나이": 20
}
}
}
Python 활용 예제
설치:
pip install pyyaml
YAML 파일 처리는 JSON과 유사하게 load와 dump 메서드를 사용합니다.
yaml.safe_load(): YAML -> 딕셔너리 변환 (중국어 포함 시 인코딩 지정 필요)yaml.dump(): 딕셔너리 -> YAML 변환 (기본값은 흐름 형식)
예제1: 문자열 -> 딕셔너리
import yaml
yaml_content = '''
이름: Cactus
나이: 18
기술:
-
- 파이썬
- 3
-
- 자바
- 5
블로그: true
연인: ~
'''
print(yaml.safe_load(yaml_content))
출력 결과:
{'이름': 'Cactus', '나이': 18, '기술': [['파이썬', 3], ['자바', 5]], '블로그': True, '연인': None}
예제2: 파일 -> 딕셔너리
import yaml
with open('config.yaml', encoding='utf-8') as f:
print(yaml.safe_load(f))
딕셔너리 -> YAML
import yaml
data_dict = {'이름': 'Cactus', '나이': 18, '기술': [['파이썬', 3], ['자바', 5]], '블로그': True, '연인': None}
print(yaml.dump(data_dict)) # 기본 흐름 형식
with open('output.yaml', 'w', encoding='utf-8') as f:
yaml.dump(data_dict, f, default_flow_style=False)
생성된 파일 내용:
이름: Cactus
나이: 18
기술:
- - 파이썬
- 3
- - 자바
- 5
블로그: true
연인: null