1. 安装PyYAML
pip install PyYAML
2. 加载yaml文件
直接使用yaml.load()函数
demo.yml :
kind: Deployment
apiVersion: apps/v1
metadata:
name: podinfo
namespace: yaml-demo
spec:
replicas: 1
selector:
matchLabels:
app: podinfo
template:
metadata:
labels:
app: podinfo
spec:
containers:
- name: podinfod
image: quay.io/stefanprodan/podinfo:0.3.0
ports:
- containerPort: 9898
load.py :
import yaml
import json
result = yaml.load(open("demo.yml"))
print json.dumps(result, indent=2)
输出 :
{
"kind": "Deployment",
"spec": {
"replicas": 1,
"template": {
"spec": {
"containers": [
{
"image": "quay.io/stefanprodan/podinfo:0.3.0",
"name": "podinfod",
"ports": [
{
"containerPort": 9898
}
]
}
]
},
"metadata": {
"labels": {
"app": "podinfo"
}
}
},
"selector": {
"matchLabels": {
"app": "podinfo"
}
}
},
"apiVersion": "apps/v1",
"metadata": {
"namespace": "yaml-demo",
"name": "podinfo"
}
}
3. 持久化dict到yml文件
使用yaml.safe_dump()函数
dump.py :
import yaml
d = {
"kind": "Deployment",
"spec": {
"replicas": 1,
"template": {
"spec": {
"containers": [
{
"image": "quay.io/stefanprodan/podinfo:0.3.0",
"name": "podinfod",
"ports": [
{
"containerPort": 9898
}
]
}
]
},
"metadata": {
"labels": {
"app": "podinfo"
}
}
},
"selector": {
"matchLabels": {
"app": "podinfo"
}
}
},
"apiVersion": "apps/v1",
"metadata": {
"namespace": "yaml-demo",
"name": "podinfo"
}
}
result = yaml.safe_dump(d, encoding="utf-8", allow_unicode=True, default_flow_style=False)
open("demo.yml", "w").write(result)
demo.yml :
apiVersion: apps/v1
kind: Deployment
metadata:
name: podinfo
namespace: yaml-demo
spec:
replicas: 1
selector:
matchLabels:
app: podinfo
template:
metadata:
labels:
app: podinfo
spec:
containers:
- image: quay.io/stefanprodan/podinfo:0.3.0
name: podinfod
ports:
- containerPort: 9898
补充知识:Python的PyYAML模块详解
简介
Python的PyYAML模块是Python的YAML解析器和生成器。
安装
简单安装
pip install pyyaml
从源码安装
下载源码包PyYAML-3.13.tar.gz 并解压,在命令行下切换到解压后的包目录内并执行如下命令:
python setup.py install
如果想使用比纯Python版本更快的LibYAML绑定,需要先下载并安装LibYAML,然后在安装PyYAML的时候执行如下命令:
python setup.py --with-libyaml install
为了使用基于LibYAML的解析器和生成器,请使用 CParser 和 CEmitter 类。例如:
from yaml import load, dump
try:
from yaml import Cloader as Loader, CDumper as Dumper
except ImportError:
from yaml import Loader, Dumper
# ...
data = load(stream, Loader=Loader)
# ...
output = dump(data, Dumper=Dumper)
请注意,基于纯Python和基于LibYAML的YAML解析器和生成器之间有一些细微但并不真正重要的区别。
最常被问到的问题
为什么如下所示的YAML文档在反序列化后再序列化,得到的YAML文档的格式与原来不一样?
import yaml
document = """
a: 1
b:
c: 3
d: 4
"""
print(yaml.dump(yaml.load(document)))
其中,上面代码的输出为:
a: 1
b: {c: 3, d: 4}
关于这个问题,其实,尽管最后得到的YAML文档的样式与原来的文档的样式不一致,但是却是正确的结果。
因为PyYAML默认会根据一个集合中是否有嵌套的集合来决定用哪种格式表示这个集合。如果一个集合中嵌套有其他集合,那么会使用块样式来表示,否则会使用流样式来表示。
如果想要集合总是以块样式表示,可以将 dump() 方法的 default_flow_style 参数值设为 False ,如下所示:
print(yaml.dump(yaml.load(document), default_flow_style=False))
上面代码的输出为:
a: 1
b:
c: 3
d: 4
使用详解
先导入 yaml 模块:
import yaml
加载YAML
警告:调用 yaml.load 处理从不可信任的源接收的数据可能存在风险。yaml.load 与 pickle.load 的功能一样强大,可以调用所有Python函数。
yaml.load 函数的作用是用来将YAML文档转化成Python对象。如下所示:
>>> yaml.load("""
... - Hesperiidae
... - Papilionidae
... - Apatelodidae
... - Epiplemidae
... """)
["Hesperiidae", "Papilionidae", "Apatelodidae", "Epiplemidae"]
yaml.load 函数可以接受一