콘텐츠로 건너뛰기

파이썬으로 YAML 사용하기

[

PyYAML를 사용한 YAML: 파이썬의 빠진 배터리

Python은 프로그래밍 언어로 거의 모든 것을 다루기 위한 대부분의 기능이 내장되어 있다고 소개됩니다. 이 말은 대체로 사실인데, 표준 라이브러리와 외부 모듈이 다양한 프로그래밍 요구사항을 커버하기 때문입니다. 그러나 YAML 데이터 형식은 설정 및 직렬화에 자주 사용되지만, 두 언어 간에는 명확한 유사점이 있음에도 불구하고 Python은 YAML을 내장 지원하지 않습니다.

이 튜토리얼에서는 사용 가능한 서드파티 라이브러리인 PyYAML을 사용하여 Python에서 YAML을 다루는 방법을 배우게 됩니다. YAML에 익숙하지 않거나 오랫동안 사용하지 않았다면, 이번 기회에 간단히 살펴보고 더 깊게 파고들 수 있습니다.

이 튜토리얼에서 다음을 배우게 됩니다:

  • Python에서 YAML 문서를 읽고 쓰는 방법
  • Python의 내장사용자 정의 데이터 유형을 YAML로 직렬화하는 방법
  • 불신할만한 출처로부터 안전하게 YAML 문서를 읽는 방법
  • 하위 수준에서 YAML 문서를 구문 분석하는 방법

나중에, YAML의 고급이자 잠재적으로 위험한 기능과 그로부터 자신을 보호하는 방법에 대해 알아보게 됩니다. 하위 수준에서 YAML을 구문 분석하기 위해 구문 강조 툴대화식 미리보기를 작성합니다. 마지막으로, 사용자 정의 YAML 태그를 활용하여 데이터 형식의 구문을 확장합니다.

YAML에 대해 간략히 살펴보기

이 섹션에서는 YAML에 대한 기본 사항을 배우게 됩니다. 사용 용도, 구문, 그리고 일부 독특하고 강력한 기능들에 대해 살펴봅니다. 이미 YAML을 사용해본 적이 있다면, 다음 섹션인 Python에서 YAML을 사용하는 내용을 읽으시면 됩니다.

역사적 배경

YAML은 “camel”과 근처 평문으로 발음됩니다. 재귀적 약자로, “YAML은 마크업 언어가 아니다”를 의미합니다. 이는 2001년에 Clark Evans에 의해 발표된 명세의 종속으로 시작되었습니다. YAML은 Python, Perl, C/C++, Ruby, Java, 등 다양한 프로그래밍 언어에서 사용할 수 있습니다.

YAML은 읽기 쉽고 사용하기 편리한 입력 양식으로 구조화된 데이터를 표현하는 것을 목표로 합니다. 이것은 JSON과 같은 다른 데이터 형식에 비해 사람이 읽고 쓰기 쉽다는 장점이 있습니다. YAML은 개체를 포함할 수 있으며, 정렬된 사전과 같은 키-값 쌍의 형식으로 데이터를 표현합니다.

대부분의 경우, YAML 파일은 설정 파일 또는 데이터 직렬화용으로 사용됩니다. 예를 들어, 사용자 정의 거리를 포함하는 웹 사이트의 설정 파일이나, 그래프 데이터를 보존하기 위해 최적화된 데이터 직렬화 형식으로 YAML을 사용할 수 있습니다.

XML과 JSON과의 비교

YAML은 XML과 JSON의 장단점을 결합한 것입니다. XML은 매우 강력하고 유연한 마크업 언어로 대량의 데이터를 처리할 수 있지만, 복잡성으로 인해 읽기 어렵고 작성하기 번거로울 수 있습니다. JSON은 단순하고 가볍지만, 트리 구조로 데이터를 표현하기 때문에 중첩된 구조를 표현하기 어려울 수 있습니다.

반면, YAML은 읽기 쉽고 사용하기 쉬운 플레인 텍스트로 데이터를 표현하는 데 중점을 둡니다. 간결한 표기법과 공백을 사용하여 데이터를 구조화합니다. 이러한 특성으로 인해 YAML은 설정 파일과 같이 사람이 읽고 쓰기 쉬운 데이터를 다루는 데 적합합니다.

YAML의 실용적 사용 사례

YAML의 실용적인 사용 사례는 다양합니다. 아래는 몇 가지 예시입니다:

  • 설정 파일: YAML은 매개변수화 된 설정값을 저장하는 데 사용할 수 있습니다. 파이썬 애플리케이션에서 설정 값을 저장하고 로딩하기 위해 YAML을 사용하면 쉽게 읽을 수 있는 설정 파일을 작성할 수 있습니다.
  • 데이터 분석: YAML은 데이터 분석 프로세스나 실험 결과와 같은 중간 데이터를 저장하는 데에도 사용할 수 있습니다. 데이터 분석 프로세스의 데이터 흐름을 이해하고 추적하기 위해 YAML을 사용할 수 있습니다.
  • 데이터 직렬화: YAML은 개체 그래프를 직렬화하여 원격 API 호출 및 데이터베이스 저장 공간과 같은 다른 매체에 저장할 수 있습니다.
  • 메타데이터: YAML은 문서 또는 사진과 같이 다른 형식의 메타데이터를 기록하기 위해 사용될 수 있습니다. 일반 텍스트보다 유연한 구조로 이러한 메타데이터를 저장할 수 있습니다.

YAML은 이외에도 다양한 사용 사례를 갖고 있습니다. 다음 섹션에서는 YAML의 구문과 고유한 기능에 대해 자세히 살펴보겠습니다.

YAML 구문

YAML 문법은 다음과 같은 주요 구성 요소로 구성됩니다:

  • 매핑: 키-값 쌍을 유지하는 데이터 구조입니다. 중첩될 수 있으며, 한 줄에 여러 개의 매핑을 함께 작성할 수도 있습니다. 매핑은 콜론(:)으로 키와 값 사이를 구분합니다.
  • 시퀀스 : 중복 항목과 순서를 갖는 목록 형식의 데이터 구조입니다. 시퀀스는 대시(-)로 시작하여 각 항목을 나타냅니다.
  • 스칼라 : 단일 값을 나타내는 데이터입니다. 정수, 부동 소수점 숫자, 불리언, 문자열 등이 스칼라입니다.

다음은 YAML의 간단한 예입니다:

name: John Smith
age: 30
is_employee: true

이 예제에서 name은 매핑의 키이고, John Smith는 해당 키의 값입니다. 이외에도 ageis_employee도 매핑의 키와 값입니다.

시퀀스의 경우, 다음과 같이 작성할 수 있습니다:

fruits:
- apple
- banana
- orange

이 예제에서 fruits는 매핑의 키이고, - 다음에 나오는 값들은 시퀀스의 항목입니다.

YAML 문법은 플레인 텍스트로 작성되며, 들여쓰기에 따라 데이터 구조의 계층 구조가 형성됩니다. 정해진 들여쓰기 규칙이 없기 때문에 개발자가 코드를 읽기 쉽게 작성할 수 있습니다.

YAML의 고유한 기능

YAML은 다른 데이터 직렬화 형식과는 다른 고유한 기능을 가지고 있습니다. 몇 가지 중요한 기능을 살펴보면 다음과 같습니다:

  • 앵커와 별표: YAML은 동일한 데이터 구조를 여러 번 사용할 수 있도록 앵커와 별표라는 개념을 제공합니다. 앵커는 구조를 공유하는 지점을 결정하고, 별표는 앵커가 있는 지점으로 이동하여 해당 구조를 참조합니다.
  • 묵시적 타입 변환: YAML은 값이 문자열이지만 자동으로 타입 변환이 필요한 경우, 이를 자동으로 수행합니다. 예를 들어, 정수를 문자열로 표현하더라도 YAML은 감지하고 해당 값을 정수로 변환합니다.
  • 공백 허용: YAML은 스칼라 값을 감싸는 따옴표를 자동으로 제거하므로, 공백이 있는 문자열을 효율적으로 표현할 수 있습니다. 공백은 문자열 앞뒤에 있어도 제거되지 않습니다.

이러한 고유한 기능들은 YAML을 다른 데이터 형식과 구별되게 만듭니다. YAML을 사용하면 작성하기 쉬운, 읽기 쉬운 데이터 파일을 작성할 수 있습니다.

다음 섹션에서는 Python에서 YAML을 사용하기 시작하는 방법에 대해 배웁니다.

Python에서 YAML 사용 시작하기

이 섹션에서는 Python에서 YAML을 사용하는 방법부터 시작합니다. 이를 위해 PyYAML 라이브러리를 설치하고 YAML 문서를 읽고 쓰는 방법을 배웁니다.

JSON으로 YAML 문서 직렬화

Python에서 YAML 문서를 다루기 위해 PyYAML 라이브러리를 사용하기 전에, YAML 문서를 JSON으로 직렬화하는 방법부터 알아보겠습니다. JSON은 Python에서 기본적으로 지원하는 데이터 형식이기 때문에, YAML을 JSON으로 변환한 다음 Python에서 처리하는 것이 간단한 방법일 수 있습니다.

다음은 YAML 문서를 JSON으로 직렬화하는 예제입니다:

import json
import yaml
yaml_document = """
name: John Smith
age: 30
is_employee: true
"""
data = yaml.safe_load(yaml_document)
json_document = json.dumps(data)
print(json_document)

이 예제에서 yaml_document는 직렬화할 YAML 문서입니다. 먼저 PyYAML의 safe_load() 함수를 사용하여 YAML 문서를 파이썬 객체로 로드합니다. 그런 다음 json.dumps() 함수를 사용하여 파이썬 객체를 JSON 문자열로 직렬화합니다. 마지막으로, JSON 문자열을 출력합니다.

출력 결과는 다음과 같을 것입니다:

{"name": "John Smith", "age": 30, "is_employee": true}

이제 YAML 문서를 JSON으로 변환했습니다. 그러나 Python에서 YAML을 직접 다루는 방법에 대해 알아보기 전에, PyYAML 라이브러리를 설치해야 합니다.

PyYAML 라이브러리 설치

PyYAML은 YAML 데이터를 파이썬에서 처리하기 위한 라이브러리입니다. 다음과 같은 명령을 사용하여 PyYAML을 설치할 수 있습니다:

Terminal window
pip install pyyaml

PyYAML이 설치되었다면 다음 섹션으로 넘어가서 파이썬에서 YAML 문서를 처리하는 방법을 배우세요.

첫 번째 YAML 문서 읽고 쓰기

PyYAML을 사용하여 YAML 문서를 파이썬에서 읽고 쓰는 방법을 알아보겠습니다. 다음 예제를 실행해보세요:

import yaml
yaml_document = """
name: John Smith
age: 30
is_employee: true
"""
# YAML 문서를 파이썬 객체로 로드
data = yaml.safe_load(yaml_document)
# YAML 문서를 딕셔너리로 파싱하여 출력
print(data)
# 딕셔너리를 YAML 문서로 직렬화하여 출력
yaml_document_2 = yaml.dump(data)
print(yaml_document_2)

이 예제에서 yaml_document는 분석할 YAML 문서입니다. safe_load() 함수를 사용하여 YAML 문서를 파이썬 객체로 로드합니다. 그런 다음, print() 함수를 사용하여 로드된 데이터를 출력합니다.

또한, data 객체를 PyYAML의 dump() 함수를 사용하여 YAML 문서로 직렬화합니다. 직렬화된 YAML 문서는 yaml_document_2에 저장되고, print() 함수를 사용하여 출력됩니다.

출력 결과는 다음과 같을 것입니다:

{'name': 'John Smith', 'age': 30, 'is_employee': True}
name: John Smith
age: 30
is_employee: true

이제 PyYAML을 사용하여 YAML 문서를 읽고 쓰는 방법을 알게 되었습니다. 다음 섹션에서는 Python에서 YAML 문서를 로드하는 방법에 대해 배웁니다.

Python에서 YAML 문서 로드

PyYAML을 사용하여 Python에서 YAML 문서를 로드하는 방법을 알아보겠습니다. 다음 예제를 실행해보세요:

import yaml
yaml_document = """
name: John Smith
age: 30
is_employee: true
"""
# YAML 문서를 파이썬 객체로 로드
data = yaml.safe_load(yaml_document)
# 파이썬 객체 출력
print(data['name'])
print(data['age'])
print(data['is_employee'])

이 예제에서 yaml_document는 로드할 YAML 문서입니다. safe_load() 함수를 사용하여 YAML 문서를 파이썬 객체로 로드합니다. 그러면 data 변수에 YAML 문서가 로드된 파이썬 객체가 저장됩니다.

이제 로드된 YAML 문서의 데이터에 접근하여 출력할 수 있습니다. data 딕셔너리의 각 키를 사용하여 데이터에 접근하고 해당 값을 출력하는 예제입니다.

출력 결과는 다음과 같을 것입니다:

John Smith
30
True

이제 PyYAML을 사용하여 Python에서 YAML 문서를 로드하는 방법을 배웠습니다. 다음 섹션에서는 Python에서 YAML 문서를 작성하는 방법에 대해 알아보겠습니다.

Python에서 YAML 문서 작성

PyYAML을 사용하여 Python에서 YAML 문서를 작성하는 방법을 알아보겠습니다. 다음 예제를 실행해보세요:

import yaml
# 파이썬 딕셔너리 생성
data = {
'name': 'John Smith',
'age': 30,
'is_employee': True
}
# 파이썬 객체를 YAML 문서로 직렬화
yaml_document = yaml.dump(data)
# YAML 문서 출력
print(yaml_document)

이 예제에서 data 딕셔너리는 YAML 문서로 작성할 데이터입니다. dump() 함수를 사용하여 파이썬 객체를 YAML 문서로 직렬화하고, 직렬화된 YAML 문서는 yaml_document에 저장됩니다.

마지막으로, print() 함수를 사용하여 YAML 문서를 출력합니다.

출력 결과는 다음과 같을 것입니다:

age: 30
is_employee: true
name: John Smith

이제 PyYAML을 사용하여 Python에서 YAML 문서를 작성하는 방법을 배웠습니다. 다음 섹션에서는 Python에서 YAML 문서를 파싱하는 방법에 대해 알아보겠습니다.

Python에서 YAML 문서 파싱

PyYAML을 사용하여 Python에서 YAML 문서를 파싱하는 방법을 알아보겠습니다. 다음 예제를 실행해보세요:

import yaml
yaml_document = """
name: John Smith
age: 30
is_employee: true
"""
# YAML 문서를 파이썬 객체로 파싱
data = yaml.safe_load(yaml_document)
# 파이썬 객체 출력
print(data['name'])
print(data['age'])
print(data['is_employee'])

이 예제에서 yaml_document는 파싱할 YAML 문서입니다. safe_load() 함수를 사용하여 YAML 문서를 파이썬 객체로 파싱합니다. 그리고 data 변수에 YAML 문서가 파싱된 파이썬 객체가 저장됩니다.

이제 파싱된 YAML 문서의 데이터에 접근하여 출력할 수 있습니다. data 딕셔너리의 각 키를 사용하여 데이터에 접근하고 해당 값을 출력하는 예제입니다.

출력 결과는 다음과 같을 것입니다:

John Smith
30
True

이제 PyYAML을 사용하여 Python에서 YAML 문서를 파싱하는 방법을 배웠습니다. 다음 섹션에서는 YAML 문서를 저수준에서 파싱하는 방법에 대해 배워보겠습니다.

저수준에서 YAML 문서 파싱

이 섹션에서는 YAML 문서의 저수준 파싱 방법에 대해 알아보겠습니다. 어휘 분석 및 이벤트 스트림 분석을 사용하여 YAML 문서를 저수준에서 파싱하는 방법을 배웁니다.

YAML 문서를 저수준에서 파싱하려면 PyYAML의 Scanner, Parser, Composer, Constructor, Emitter와 같은 클래스를 사용해야 합니다. 이러한 클래스를 사용하여 다양한 저수준 작업을 수행할 수 있습니다. YAML 문서를 토큰으로 분리하거나, 이벤트 스트림으로 파싱하거나, 노드 트리를 구축할 수 있습니다.

저수준 파싱을 수행하기 위해 다음과 같은 단계를 따라야 합니다:

  1. YAML 문서를 어휘 분석하여 토큰으로 분리합니다.
  2. 토큰이 생성되면 이를 사용하여 이벤트 스트림을 생성합니다.
  3. 이벤트 스트림을 사용하여 노드 트리를 구축합니다.

각 단계의 세부 내용은 에디터에서 실제 코드를 작성하면서 자세히 알아보겠습니다.

파싱할 YAML 문서가 있는 경우, 각 단계를 순서대로 수행하여 어떻게 문서가 어떻게 파싱되는지 살펴보십시오. 저수준 파싱을 위해 다음 코드를 사용할 수 있습니다:

import yaml
yaml_document = """
name: John Smith
age: 30
is_employee: true
"""
# 어휘 분석
scanner = yaml.Scanner(yaml_document)
while scanner.check_token():
print(scanner.get_token())
# 이벤트 스트림 분석
parser = yaml.Parser(scanner)
while parser.check_event():
print(parser.get_event())
# 노드 트리 구축
composer = yaml.Composer(parser)
while composer.check_node():
print(composer.get_node())

위의 예제는 어휘 분석, 이벤트 스트림 분석, 노드 트리 구축을 수행하는 세 가지 단계를 보여줍니다. 각각의 단계에서 해당하는 클래스를 생성하고, 클래스의 메서드를 호출하여 작업을 수행합니다. 이 메서드를 호출할 때마다 어떤 작업이 수행되는지 확인할 수 있습니다.

저수준 파싱을 수행하기 위해 다양한 클래스와 메서드를 사용해야 하기 때문에 상당히 복잡할 수 있습니다. 따라서 대부분의 경우, PyYAML의 상위 수준 인터페이스를 활용하는 것이 더 효율적일 수 있습니다.

결론

이 튜토리얼에서는 PyYAML을 사용하여 Python에서 YAML을 다루는 방법에 대해 배웠습니다. YAML에 대한 간략한 개요와 YAML 문서의 구문, PyYAML 라이브러리를 사용하여 YAML을 다루는 방법을 배웠습니다. 파일에서 YAML 문서를 로드하고, Python 객체로 로드된 YAML을 다시 YAML 문서로 작성하는 방법을 배웠습니다. 또한 YAML 문서를 파싱하는 방법과 저수준으로 파싱하는 방법을 살펴보았습니다.

YAML은 Python에서 자주 사용되는 데이터 형식 중 하나입니다. PyYAML을 사용하면 Python에서 YAML을 처리하는 데 유용한 도구를 사용할 수 있습니다. Python에서 YAML 작업을 수행해야 하는 경우, PyYAML은 이를 간단하고 편리하게 처리할 수 있는 옵션입니다.