Python 딕셔너리 YAML 변환 및 읽기(3가지 모듈)

Python에서 데이터를 저장하고 읽어오는 방식은 다양하지만, 그 중에서도 YAML은 가독성이 뛰어나고 구조화된 데이터를 표현하기에 적합한 포맷입니다. Python 딕셔너리 YAML 변환 방법과 YAML 파일을 읽어서 딕셔너리 객체로 불러오는 방법에 대해 살펴보겠습니다.

Python 딕셔너리 YAML 변환 모듈 소개

PyYAML

가장 널리 사용되는 YAML 파싱 라이브러리는 PyYAML입니다. PyYAML은 설치가 간편하고 사용법이 직관적이어서 많은 개발자들이 애용합니다.

ruamel.yaml

ruamel.yaml은 PyYAML의 후속작으로, YAML 1.2 표준을 지원하며 좀 더 세부적인 기능을 제공합니다. 대규모 프로젝트나 보다 복잡한 YAML 작업을 필요로 할 때 유용합니다.

oyaml

oyaml은 순서가 유지되는 YAML을 다루기 위한 라이브러리입니다. Python 3.7 이후에는 dictionary의 순서가 보장되지만, 호환성을 위해 여전히 이 라이브러리를 사용하는 경우도 있습니다.

PyYAML을 사용한 예제

가장 많이 사용하는 PyYAML을 설치하는 방법부터 PyYAML을 사용해 dictionary 객체를 YAML 파일로 저장하고 읽어오는 방법을 차례대로 설명하겠습니다.

PyYAML 설치 방법

PyYAML은 pip install 명령어를 사용해서 모듈을 설치한 후 이용할 수 있습니다.

pip install pyyaml
Python

Dictionary 객체를 YAML 파일로 저장하기

우선, Python에서 dictionary 객체를 YAML 파일로 저장할 때에는 yaml.dump()를 이용합니다. 다음은 예제 코드입니다.

import yaml

# 저장할 딕셔너리 객체
data = {
    'name': '홍영희',
    'age': 28,
    'city': '나주시',
    'children': ['김만복', '김영수']
}

# 딕셔너리 객체를 YAML 파일로 저장
with open('data.yaml', 'w') as fp:
    yaml.dump(data, fp, default_flow_style=False, allow_unicode=True)
    fp.close()
Python

여기서 default_flow_style=False는 YAML 파일을 사람이 읽기 쉽게 만들기 위한 옵션입니다. allow_unicode=True는 유니코드 문자가 올바르게 저장되도록 합니다.

아래의 그림은 default_flow_style을 True로 지정한 결과 저장된 data.yaml 파일의 내용입니다.

그림 1. Python 딕셔너리 YAML 변환 결과: flow style
그림 1. Python 딕셔너리 YAML 변환 결과: flow style

아래 그림은 default_flow_style 값을 False로 지정한 결과 저장된 data.yaml 파일입니다. 데이터가 많아질수록 아래의 경우가 더 읽기 쉽다는 것을 알 수 있습니다.

그림 2. Python 딕셔너리 YAML 변환 결과: not flow style
그림 2. Python 딕셔너리 YAML 변환 결과: not flow style

YAML 파일에서 Dictionary 객체 읽어오기

저장된 YAML 파일을 다시 읽어와 dictionary 객체로 변환할 때에는 yaml.load()를 이용합니다. 안전하게 YAML 파일을 읽기 위해서 SafeLoader를 이용하는 것이 보안상 권장됩니다.

import yaml

# YAML 파일 읽기
with open('data.yaml', 'r') as file:
    data_loaded = yaml.load(file, yaml.SafeLoader)

print(data_loaded)
Python

ruamel.yaml을 사용한 예제

ruamel.yaml을 사용한 예제도 살펴보겠습니다.

ruamel.yaml 설치 및 사용

설치는 pip install 명령어를 사용해서 ruamel.yaml을 설치할 수 있습니다.

pip install ruamel.yaml
Python

딕셔너리 YAML 변환 방법

ruamel.yaml을 이용할 때에는 YAML 클래스의 인스턴스 객체를 생성한 후, 해당 객체를 사용해서 dump() 메서드를 이용하여 파이썬 딕셔너리 객체를 YAML 파일로 저장할 수 있습니다.

from ruamel.yaml import YAML

yaml = YAML()

# 저장할 dictionary 객체
data = {
    'name': '홍영희',
    'age': 28,
    'city': '나주시',
    'children': ['김만복', '김영수']
}

# dictionary 객체를 YAML 파일로 저장
with open('data_ruamel.yaml', 'w') as fp:
    yaml.dump(data, fp)
Python

YAML 딕셔너리로 읽기

YAML 파일을 딕셔너리로 읽기 위해서는 저장할 때와 마찬가지로 YAML 객체를 생성한 후 load() 메서드를 사용하여 YAML 파일을 읽어서 파이썬 딕셔너리 객체로 가져올 수 있습니다.

from ruamel.yaml import YAML

yaml = YAML()

# YAML 파일 읽기
with open('data.yaml', 'r') as fp:
    data_loaded = yaml.load(fp)

print(data_loaded)
Python

oyaml을 사용한 예제

마지막으로, oyaml을 사용한 예제입니다. oyaml은 딕셔너리의 키 순서를 유지한 채로 YAML을 다룰 수 있게 해줍니다.

oyaml 설치 방법

oyaml 설치는 pip install 명령어를 사용하여 설치할 수 있습니다.

pip install oyaml
Python

파이썬 딕셔너리 to YAML 파일

앞서 PyYAML을 이용해서 yaml로 저장한 경우에는 그림 1이나 그림 2와 같이 키의 순서가 재정렬되는 현상이 있습니다. oyaml을 이용하면 현재 dictionary의 키 순서를 그대로 유지한 채로 저장하고 불러옵니다. 사용법은 PyYAML과 거의 같습니다.

import oyaml as yaml

# 저장할 dictionary 객체
data = {
    'name': '홍영희',
    'age': 28,
    'city': '나주시',
    'children': ['김만복', '김영수']
}

# dictionary 객체를 YAML 파일로 저장
with open('data.yaml', 'w') as fp:
    yaml.dump(data, fp, default_flow_style=False, allow_unicode=True)
Python

위의 코드를 실행하면 data 값을 지정해준 라인 5부터 라인 8까지의 순서를 그대로 유지한 채로 아래 그림과 같이 yaml 파일이 저장된 것을 확인할 수 있습니다.

그림 3. Python 딕셔너리 YAML 변환: 키의 순서를 유지한 채로 변환
그림 3. Python 딕셔너리 YAML 변환: 키의 순서를 유지한 채로 변환

YAML 딕셔너리로 읽기

YAML 파일을 읽어오는 방식은 PyYAML과 거의 같습니다.

import oyaml as yaml

# YAML 파일 읽기
with open('data.yaml', 'r') as fp:
    data_loaded = yaml.safe_load(fp)

print(data_loaded)
Python

정리

Python에서 YAML 파일을 다루는 방법은 여러 가지가 있으며, PyYAML, ruamel.yaml, oyaml 등의 라이브러리를 사용하면 손쉽게 dictionary 객체를 YAML 파일로 저장하고 읽어올 수 있습니다. 각 라이브러리는 저마다의 장단점이 있으므로, 프로젝트의 요구사항에 맞는 라이브러리를 선택하는 것이 중요합니다.

이 포스팅을 통해 Python에서 YAML 파일을 다루는 기본적인 방법을 익히고, 다양한 라이브러리를 활용하여 더 효율적으로 데이터를 관리해 보세요.

관련 자료

같이 읽으면 좋은 글

Leave a Comment