본문 바로가기
Programming/Python

[Python] YAML (YAML Ain’t Markup Language)

by goatlab 2022. 8. 17.
728x90
반응형
SMALL

YAML (YAML Ain’t Markup Language)

 

데이터 쓰기를 위한 또 다른 텍스트 형식이다. YAML은 JSON보다 인간 친화적이므로 소프트웨어에서 작업을 설명하는 데 자주 사용된다.

 

YAML syntax

 

Python과 마찬가지로 YAML은 들여쓰기를 사용하여 문서 구조를 지정한다. 그러나 YAML은 공백만 사용할 수 있으며 탭은 사용할 수 없다. 파이썬과의 또 다른 유사점은 # 주석이 줄로 시작하여 줄 끝까지 계속된다는 것이다.

 

List

 

목록은 한 줄로 작성할 수 있다.

 

[switchport mode access, switchport access vlan, switchport nonegotiate, spanning-tree portfast, spanning-tree bpduguard enable]
- switchport mode access
- switchport access vlan
- switchport nonegotiate
- spanning-tree portfast
- spanning-tree bpduguard enable

 

이러한 블록에 목록을 작성할 때 각 행은 `` - `` (빼기 및 공백)로 시작해야 하며 목록의 모든 행은 동일한 들여쓰기 수준에 있어야 한다.

 

Dictionary

 

사전은 한 줄로 작성할 수도 있다.

 

{vlan: 100, name: IT}

# 또는 블록
vlan: 100
name: IT

 

Strings

 

YAML의 문자열은 따옴표로 묶을 필요가 없다. 이것은 편리하지만 때로는 따옴표를 사용해야 합니다. 예를 들어, 특수 문자 (YAML의 경우)가 문자열에 사용되는 경우이다.

 

예를 들어, 이 줄은 YAML이 올바르게 이해하려면 인용해야 한다.

 

command: "sh interface | include Queueing strategy:"

 

Combination of elements

 

# 두 개의 키가 있는 사전: access 및 trunk. 다음 key에 해당하는 value - command list
access:
- switchport mode access
- switchport access vlan
- switchport nonegotiate
- spanning-tree portfast
- spanning-tree bpduguard enable

trunk:
- switchport trunk encapsulation dot1q
- switchport mode trunk
- switchport trunk native vlan 999
- switchport trunk allowed vlan
# List of dictionaries
- BS: 1550
  IT: 791
  id: 11
  name: Liverpool
  to_id: 1
  to_name: LONDON
- BS: 1510
  IT: 793
  id: 12
  name: Bristol
  to_id: 1
  to_name: LONDON
- BS: 1650
  IT: 892
  id: 14
  name: Coventry
  to_id: 2
  to_name: Manchester

 

PyYAML module

 

Python은 PyYAML 모듈을 사용하여 YAML을 사용한다. 표준 모듈 라이브러리의 일부가 아니므로 설치해야 한다.

 

pip install pyyaml

 

이것으로 작업하는 것은 csv 및 json 모듈과 유사하다.

 

Reading from YAML

 

# YAML 파일에서 Python 객체로 데이터 변환
- BS: 1550
  IT: 791
  id: 11
  name: Liverpool
  to_id: 1
  to_name: LONDON
- BS: 1510
  IT: 793
  id: 12
  name: Bristol
  to_id: 1
  to_name: LONDON
- BS: 1650
  IT: 892
  id: 14
  name: Coventry
  to_id: 2
  to_name: Manchester
# YAML에서 읽기
import yaml
from pprint import pprint

with open('info.yaml') as f:
    templates = yaml.safe_load(f)

pprint(templates)
$ python yaml_read.py
[{'BS': 1550,
  'IT': 791,
  'id': 11,
  'name': 'Liverpool',
  'to_id': 1,
  'to_name': 'LONDON'},
 {'BS': 1510,
  'IT': 793,
  'id': 12,
  'name': 'Bristol',
  'to_id': 1,
  'to_name': 'LONDON'},
 {'BS': 1650,
  'IT': 892,
  'id': 14,
  'name': 'Coventry',
  'to_id': 2,
  'to_name': 'Manchester'}]

 

Writing to YAML

 

# YAML에 Python 객체 쓰기
import yaml

trunk_template = [
    'switchport trunk encapsulation dot1q', 'switchport mode trunk',
    'switchport trunk native vlan 999', 'switchport trunk allowed vlan'
]

access_template = [
    'switchport mode access', 'switchport access vlan',
    'switchport nonegotiate', 'spanning-tree portfast',
    'spanning-tree bpduguard enable'
]

to_yaml = {'trunk': trunk_template, 'access': access_template}

with open('sw_templates.yaml', 'w') as f:
    yaml.dump(to_yaml, f, default_flow_style=False)

with open('sw_templates.yaml') as f:
    print(f.read())
# sw_templates.yaml 파일
access:
- switchport mode access
- switchport access vlan
- switchport nonegotiate
- spanning-tree portfast
- spanning-tree bpduguard enable
trunk:
- switchport trunk encapsulation dot1q
- switchport mode trunk
- switchport trunk native vlan 999
- switchport trunk allowed vlan

 

https://pyneng.readthedocs.io/en/latest/book/17_serialization/yaml.html

 

Work with YAML files - Python for network engineers

Previous Work with JSON files

pyneng.readthedocs.io

 

728x90
반응형
LIST