yaml在python上的使用
YAML是一种容易人类阅读、适合表示程序语言的数据结构、可用于不同程序间交换数据、支持泛型工具、支持串行处理、丰富的表达能力和可扩展性、易于使用的语言。YAML利用缩进或者是explicit indicatior(如{})来表示属性的嵌套,更为直观和simple。
一、YAML的格式
YAML的格式及特点如下:
- YAML使用可打印的Unicode字元,可使用UTF-8或UTF-16。
- 使用空白字元为文件缩排来表示结构;不过不能使用跳格字元(TAB)。
- 注解由井字号( # )开始,可以出现在一行中的任何位置,而且范围只有一行(也就是一般所谓的单行注解)
- 每个清单成员以单行表示,并用短杠+空白( – )起始。或使用方括号( [ ] ),并用逗号+空白( , )分开成员。
- 每个杂凑表的成员用冒号+空白( : )分开键值和内容。或使用大括号( { } ),并用逗号+空白( , )分开。
- 杂凑表的键值可以用问号 ( ? )起始,用来明确的表示多个词汇组成的键值。
- 字串平常并不使用引号,但必要的时候可以用双引号 ( “ )或单引号 ( ‘ )框住。
- 使用双引号表示字串时,可用倒斜线( \ )开始的跳脱字元(这跟C语言类似)表示特殊字元。
- 区块的字串用缩排和修饰词(非必要)来和其他资料分隔,有新行保留(preserve)(使用符号 | )或新行折叠(flod)(使用符号 > )两种方式。
- 在单一档案中,可用连续三个连字号(—)区分多个档案。
- 另外,还有选择性的连续三个点号( … )用来表示档案结尾。
- 重复的内容可使从参考标记星号 ( * )复制到锚点标记( & )。
- 指定格式可以使用两个惊叹号 ( !! ),后面接上名称。
- 档案中的单一文件可以使用指导指令,使用方法是百分比符号( % )。有两个指导指令在YAML1.1版中被定义:
- %YAML 指导指令,用来识别文件的YAML版本。
- %TAG 指导指令,被用在URI的字首标记。这个方法在标记节点的型态时相当有用。
YAML再使用逗号及冒号时,后面都必须接一个空白字元。
二、PyYAML的使用
1、安装
python下安装PyYAML模块可以使用YAML ,打开https://pypi.python.org/pypi/PyYAML下载,当前版本3.11 。pypi 站点上对该模块的描述如下:PyYAML features a complete YAML 1.1 parser, Unicode support, pickle support, capable extension API, and sensible error messages 。
可以连网的主机也可以通过pip install pyyaml 或easy_install pyymal 进行安装。
2、yaml.load与yaml.dump方法
该模块提供了一些方法,不过常用的方法只有两个yaml.load和yaml.dump ,以下是一个版本相关的yaml 格式文件
1[root@361way yaml]# cat tree.yaml
2treeroot:
3 branch1:
4 name: Node 1
5 branch1-1:
6 name: Node 1-1
7 branch2:
8 name: Node 2
9 branch2-1:
10 name: Node 2-1
yaml.load方法:
1# 脚本内容
2[root@361way yaml]# cat load.py
3import yaml
4f = open('tree.yaml')
5dataMap = yaml.load(f)
6f.close()
7print dataMap
8# 执行结果如下
9[root@361way yaml]# python load.py
10{'treeroot': {'branch2': {'branch2-1': {'name': 'Node 2-1'}, 'name': 'Node 2'}, 'branch1': {'branch1-1': {'name': 'Node 1-1'}, 'name': 'Node 1'}}}
yuml.dump方法:
这里还承接上面的脚本,调用里面的dataMap 数据,将其保存一直新的yaml 文件,如下:
1# 代码如下:
2f = open('newtree.yaml', "w")
3yaml.dump(dataMap, f)
4f.close()
5#newtree.yaml 的结果如下
6[root@361way yaml]# cat newtree.yaml
7treeroot:
8 branch1:
9 branch1-1: {name: Node 1-1}
10 name: Node 1
11 branch2:
12 branch2-1: {name: Node 2-1}
13 name: Node 2
除此之外,还有safe_load、safe_dump、 load_all 等主法,具体可以通过pydoc yaml 进行查看。
三、yaml、xml与json
1、yaml 与xml
以下是同一内容,分别使用xml 语言标记与 yaml 语言标记:
1# xml标记两个site
2<site>
3 <name>sina</name>
4 <url>https://blog.361way.com</url>
5</site>
6<site>
7 <name>google</name>
8 <url>http://www.91it.org</url>
9</site>
10# 使用yaml标记两个site
11---
12site:
13 name: sina
14 url : https://blog.361way.com
15---
16site:
17 name: google
18 url : http://www.91it.org
19# 使用yaml标记两个site
20---
21site: {name: sina, url: https://blog.361way.com}
22---
23site: {name: google, url: http://www.91it.org}
从读取查看的角度来看,有没有发现yaml 相对xml 语言的优势。
2、yaml 与 json
准确的说json 应该算是yaml 标准下的一个字集,通过python语句可以很方面的在两者之间进行转换。
a、转换YAML到JSON
1# python -c 'import sys, yaml, json; json.dump(yaml.load(sys.stdin), sys.stdout, indent=4)' file.json
2或
3#!/usr/bin/env python
4import yaml,json
5yml = """
6---
7 foo: bar
8"""
9data = yaml.load(yml)
10json = json.dumps(data)
11print(json)
b、转换JSON到YAML
1# python -c 'import sys, yaml, json; yaml.dump(json.load(sys.stdin), sys.stdout, default_flow_style=False)' file.yaml
2或
3#!/usr/bin/env python
4import json,yaml
5str = '{ "foo": "bar" }'
6data = json.loads(str)
7yml = yaml.safe_dump(data)
8print(yml)
注:很多情况下,甚至可以直接将json后缀的文件改为yaml 后缀,使用yaml 语言直接解析。
四、yaml 在python语言中的应用
yaml 语言在很多优秀的python 程序中都有使用,比如运维工程师经常使用的两个自动化工作saltstack 与 Ansible 。更多PyYAML 模块的用法,也可以查看其官方wiki 页面:http://pyyaml.org/wiki/PyYAMLDocumentation 。
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/python-pyyaml-module/4271.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.