Python YAML 문법을 파싱하는 PyYAML 라이브러리 알아보기

오늘은 Python으로 YAML 문법을 파싱해서 변수로 변환하게 해주는 PyYAML 패키지를 알아보려 합니다.

PyYAML 설치

우선 virtualenv로 파이썬 환경을 분리해줍니다.

pip3 install virtualenv
virtualenv -mvenv env

env라는 이름의 가상 환경을 생성합니다.

source env/bin/activate

가상환경을 폴더에서 활성화합니다.

pip3 install --upgrade pip

pip의 업그레이드가 존재하는지 확인하고 진행합니다.

pip install pyyaml

pip로 PyYAML을 설치합니다.

예제

import yaml

yaml 패키지를 가져옵니다.

test = yaml.load("""
- first
- second
- third
""")

print(test)

yaml 형식으로 작성된 텍스트를 불러옵니다.

yaml.warnings({'YAMLLoadWarning': False})

출력창에 나오는 경고를 지울 수 있습니다.

test = yaml.load("""
- first
- second
- third
""", Loader=yaml.FullLoader)

print(test)

아니면 경고를 없애기 위해 full YAML language를 로드해서 불러와도 됩니다.

doc = """
---
name: hello world
description: >
    testing file
---
name: readme
description: >
    readme file
---
name: make
description: >
    build file
"""

for data in yaml.load_all(doc):
    print(data)

각 블럭들을 모두 로드하면 for문으로 분리하여 출력할 수 있습니다.

test = yaml.load("""
none: [~, null]
bool: [true, false, on, off]
int: 10
float: 3.14
list: [string,string]
dict: {id: "test_id", count: 5}
""")
print(test)

불러올 때에 자동으로 파이썬 타입으로 변환됩니다.

print(yaml.dump({'name': 'test_name', 'email': 'example@example.com', 'todo': ['post article', 'sql study']}))

딕셔너리로 덤프하면 yaml 형식의 텍스트로 변경되어 출력됩니다.

class TestClass:
    def __init__(self, id_, name, count):
        self.id = id_
        self.name = name
        self.count = count

obj = yaml.load("""
!!python/object:__main__.TestClass
id: test_id
name: test_name
count: 1
""")
print(obj.id)
print(obj.name)
print(obj.count)

파이썬 객체로 저장할 수 있습니다.

print(yaml.dump(TestClass(id_="test_id", name="test_name", count=1)))

반대로 객체를 덤프하면 yaml 텍스트로 출력할 수 있습니다.

Written on June 25, 2019