Python使用YAML
我们知道YAML比JSON更适合于作为配置文件,因为YAML更适合人阅读与编辑,而JSON更适合程序处理。
当我们希望在Web界面上编辑配置文件的时候,可以找到前端YAML编辑器插件来实现更好的编辑体验。
在后端数据库中,我们应该将YAML转化成JSON在入库,因为JSON更适合后端数据操作。
我们可以为python安装PyYAML库,实现YAML的序列化/反序列化,并且实现和JSON之间的互相转换:https://pypi.org/project/PyYAML/。
反序列化YAML
假设YAML如下:
1 2 3 4 5 6 7 8 9 10 11 |
kind: Service apiVersion: v1 metadata: name: myservice spec: selector: app: myservice ports: - protocol: TCP port: 80 targetPort: 80 |
然后可以这样解析它:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import yaml input = """ kind: Service apiVersion: v1 metadata: name: myservice spec: selector: app: myservice ports: - protocol: TCP port: 80 targetPort: 80 """ a = yaml.safe_load(input) print(a) |
YAML已被解析为python的字典:
1 |
{'kind': 'Service', 'apiVersion': 'v1', 'metadata': {'name': 'myservice'}, 'spec': {'selector': {'app': 'myservice'}, 'ports': [{'protocol': 'TCP', 'port': 80, 'targetPort': 80}]}} |
序列化YAML
然后可以再把它变回YAML:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import yaml input = """ kind: Service apiVersion: v1 metadata: name: myservice spec: selector: app: myservice ports: - protocol: TCP port: 80 targetPort: 80 """ a = yaml.safe_load(input) b = yaml.safe_dump(a, allow_unicode=True) print(b) |
输出如下:
1 2 3 4 5 6 7 |
apiVersion: v1 kind: Service metadata: {name: myservice} spec: ports: - {port: 80, protocol: TCP, targetPort: 80} selector: {app: myservice} |
YAML转JSON
因为是python字典,也可以序列化为json:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import yaml import json input = """ kind: Service apiVersion: v1 metadata: name: myservice spec: selector: app: myservice ports: - protocol: TCP port: 80 targetPort: 80 """ a = yaml.safe_load(input) b = json.dumps(a) print(b) |
输出如下:
1 |
{"kind": "Service", "apiVersion": "v1", "metadata": {"name": "myservice"}, "spec": {"selector": {"app": "myservice"}, "ports": [{"protocol": "TCP", "port": 80, "targetPort": 80}]}} |
序列化/反序列化多个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 26 27 28 29 30 31 32 33 34 35 |
import yaml import json input = """ kind: Service apiVersion: v1 metadata: name: myservice spec: selector: app: myservice ports: - protocol: TCP port: 80 targetPort: 80 --- kind: Service apiVersion: v1 metadata: name: yourservice spec: selector: app: yourservice ports: - protocol: TCP port: 80 targetPort: 80 --- """ a = yaml.safe_load_all(input) a = list(a) b = yaml.safe_dump_all(a, allow_unicode=True) print(b) |
输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
apiVersion: v1 kind: Service metadata: {name: myservice} spec: ports: - {port: 80, protocol: TCP, targetPort: 80} selector: {app: myservice} --- apiVersion: v1 kind: Service metadata: {name: yourservice} spec: ports: - {port: 80, protocol: TCP, targetPort: 80} selector: {app: yourservice} --- null ... |
最后
pyyaml对中文的支持有点坑,需要我们在使用dump/dump_all方法的时候传参allow_unicode=True,否则序列化后中文会变成一坨被转移的unicode,导致业务无法正常工作。
如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~
