2022년 4월 23일 토요일

YAML 이건 꼭 써야됩니다. 아직도 안쓰는 분 있다면 적극 추천 (json 대체)

YAML 소개입니다.

예전에 XML을 많이 사용했었죠? 그러다가 XML을 사용하다보면 뭔가 복잡하고 쓰기도 힘들고  많은 부분에서 json 을 사용했습니다. 

그런데 json도 많이 사용하다보니 문제가 발생합니다. json을 많이 작성하다보면 주석이 안됩니다. data 저장용이나 설정값으로 많이 사용하는데 주석이 안되니 엄청 불편합니다. 일일이 다른곳에 설명서를 만들어야 합니다.


1. 기본

YAML이 뭔데 추천하는지 알아보도록 하겠습니다.

알아둬야 하는 기본적인 내용이 있는데 python과 비슷하게 들여쓰기를 이용한 하위 구조체를 만듭니다.

1.1. 공백 문자를 이용한 들여쓰기로 구조체를 구분한다. 그러나 탭문자를 들여쓰기에 사용하지 않는다.

1.2. - 는 list( - 뒤 공백 필요)

1.3. 값: hash즉 python용어로는 dict 형태( : 뒤 공백 필요 )

1.4. --- 블록을 의미함

같은 내용을 JSON, YAML 예제로 사용해보면 쉽게 이해가 갈겁니다.


2. 예제

https://www.json2yaml.com/ 여기에서 변환이 가능합니다.


json

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
{
  "json": [
    "rigid",
    "better for data interchange"
  ],
  "yaml": [
    "slim and flexible",
    "better for configuration"
  ],
  "object": {
    "key": "value",
    "array": [
      {
        "null_value": null
      },
      {
        "boolean": true
      },
      {
        "integer": 1
      },
      {
        "alias": "aliases are like variables"
      },
      {
        "alias": "aliases are like variables"
      }
    ]
  },
  "paragraph": "Blank lines denote \nparagraph breaks\n",
  "content": "Or we\ncan auto\nconvert line breaks\nto save space",
  "alias": {
    "bar": "baz"
  },
  "alias_reuse": {
    "bar": "baz"
  }
}


yaml - _40_yaml_data.yaml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 주석
json:
- rigid
- better for data interchange
yaml:
- slim and flexible
- better for configuration
object:
  key: value
  array:
  - null_value:
  - boolean: true
  - integer: 1
  - alias: aliases are like variables
  - alias: aliases are like variables
paragraph: "Blank lines denote \nparagraph breaks\n"
content: |-
  Or we
  can auto
  convert line breaks
  to save space
alias:
  bar: baz
alias_reuse:
  bar: baz


text 입력시 기본적으로는 앞뒤 공백이 사라지니 주의가 필요하나 "" 따옴표로 묶으면 공백도 포함하게 됩니다. 기본적으로는 따옴표를 사용하지 않아도 됩니다.


3. python에서 yaml 사용

json 과 yaml을 동시에 read/write가능한 함수를 만들었습니다.

python에서 yaml 을 사용하려면 pip install pyyaml 로 패키지를 설치하도록 합니다.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import json
import yaml # pip install pyyaml
import os

def write_file(filename, data):
	format = ''
	if filename.endswith(".json"):
		format = "json"
	if filename.endswith(".yaml"):
		format = "yaml"
	if filename.endswith(".yml"):
		format = "yml"
	with open(filename, 'w', encoding='utf-8') as fp:
		if format == 'json':
			json.dump(data, fp)
		elif format == 'yaml':
			yaml.dump(data, fp)
		else:
			fp.write(data)
		fp.close()

def write_json(filename, data):
	with open(filename, 'w', encoding='utf-8') as fp:
		json.dump(data, fp)
		fp.close()

def read_file(filename):
	format = ''
	if filename.endswith(".json"):
		format = "json"
	if filename.endswith(".yaml"):
		format = "yaml"
	if filename.endswith(".yml"):
		format = "yml"
	with open(filename, 'r', encoding='utf-8') as fp:
		if format == 'json':
			ret_data = json.load(fp)
		elif format == 'yaml':
			ret_data = yaml.load(fp,Loader=yaml.FullLoader)
		else:
			ret_data = fp.read()
		fp.close()
		return ret_data
	return None

if __name__ == "__main__":
	data = read_file("_40_yaml_data.yaml")
	print("Loaded")
	print(data)
	write_file("json_test.json",data)
	data2 = read_file("json_test.json")
	print("Loaded2")
	print(data2)
	write_file("json_test.yaml",data)
	
'''

# output

Loaded
{'json': ['rigid', 'better for data interchange'], 'yaml': ['slim and flexible', 'better for configuration'], 'object': {'key': 'value', 'array': [{'null_value': None}, {'boolean': True}, {'integer': 1}, {'alias': 'aliases are like variables'}, {'alias': 'aliases are like variables'}]}, 'paragraph': 'Blank lines denote \nparagraph breaks\n', 'content': 'Or we\ncan auto\nconvert line breaks\nto save space', 'alias': {'bar': 'baz'}, 'alias_reuse': {'bar': 'baz'}}
Loaded2
{'json': ['rigid', 'better for data interchange'], 'yaml': ['slim and flexible', 'better for configuration'], 'object': {'key': 'value', 'array': [{'null_value': None}, {'boolean': True}, {'integer': 1}, {'alias': 'aliases are like variables'}, {'alias': 'aliases are like variables'}]}, 'paragraph': 'Blank lines denote \nparagraph breaks\n', 'content': 'Or we\ncan auto\nconvert line breaks\nto save space', 'alias': {'bar': 'baz'}, 'alias_reuse': {'bar': 'baz'}}

'''


확장자를 이용하여 yaml, json을 구별해서 처리하도록 되어있습니다.

위의 예제에 사용하는 예제는 앞서 설명드린 yaml - _40_yaml_data.yaml 사용하였습니다.



댓글 없음:

댓글 쓰기