九子夺嫡,是指清朝康熙皇帝的儿子们争夺皇位的历史事件。当时康熙皇帝序齿的儿子有24个,其中有9个参与了皇位的争夺。九个儿子分别是:大阿哥爱新觉罗·胤禔、二阿哥爱新觉罗·胤礽、三阿哥爱新觉罗·胤祉、四阿哥爱新觉罗·胤禛、八阿哥爱新觉罗·胤禩、九阿哥爱新觉罗.胤禟、十阿哥爱新觉罗·胤䄉、十三阿哥爱新觉罗·胤祥、十四阿哥爱新觉罗·胤禵。最后四阿哥胤禛胜出,在康熙帝去世后继承皇位,成为雍正帝。
YAML基础 一、概念 编程免不了要写配置文件,怎么写配置也是一门学问。YAML是专门用来写配置文件的语言,非常简洁和强大,远比JSON格式方便。
YAML(/ˈjæməl/,尾音类似camel骆驼)是一个可读性高,用来表达数据序列化的格式。在开发的这种语言时,YAML的本意其实是:”Yet Another Markup Language”(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名,”YAML Ain’t a Markup Language”的递归缩写。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等,目前已有多种编程支持或者说解析YAML。
二、语法
基本语法
大小写敏感
使用缩进表示层级关系
缩进不允许使用tab,只允许空格
缩进的空格数不重要,只要相同层级的元素左对齐即可
#表示注释
&
用来建立锚点
<<
表示合并到当前数据
*
用来引用锚点
支持的数据类型
对象:键值对的集合,又称为映射(mapping)/哈希(hashes)/字典(dictionary)。
数组:一组按次序排列的值,又称为序列(sequence)/列表(list)。
纯量:单个的、不可再分的值,包括字符串、布尔值、整数、浮点数、Null、时间、日期。
三、使用
YAML对象
对象键值对使用冒号结构表示key: value
(冒号后面要加一个空格)
对象键值对也可以使用key: {key1: value1, key2: value2, ...}
使用缩进表示层级关系
较为复杂的对象格式,可以使用问号加一个空格代表一个复杂的key
,配合一个冒号加一个空格代表一个value
1 2 3 4 5 6 7 8 9 10 key: child-key: value child-key2: value2 ? - complexkey1 - complexkey2 : - complexvalue1 - complexvalue2
1 2 3 4 5 6 7 8 9 10 11 - &showell Steve - Clark - Brian - Oren - *showell 转为JavaScript代码如下: [ 'Steve', 'Clark', 'Brian', 'Oren', 'Steve' ]
YAML数组
以-
开头的行表示构成一个数组
支持多维数组,可以使用行内表示key: [value1, value2, ...]
数据结构的子成员是一个数组,则可以在该项下面缩进一个空格
数组也可以使用流式(flow)的方式表示companies: [{id: 1,name: company1,price: 200W},{id: 2,name: company2,price: 500W}]
1 2 3 4 5 6 7 8 9 companies: - id: 1 name: company1 price: 200W - id: 2 name: company2 price: 500W
表示companies 属性是一个数组,每一个数组元素又是由 id、name、price 三个属性构成。
纯量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 boolean: - TRUE #true,True都可以 - FALSE #false,False都可以 float: - 3.14 - 6.8523015e+5 #可以使用科学计数法 int: - 123 - 0b1010_0111_0100_1010_1110 #二进制表示 null: nodeName: 'node' parent: ~ #使用~表示null string: - 哈哈 - 'Hello world' #可以使用双引号或者单引号包裹特殊字符 - newline newline2 #字符串可以拆成多行,每一行会被转化成一个空格 date: - 2018-02-17 #日期必须使用ISO 8601格式,即yyyy-MM-dd datetime: - 2018-02-17T15:02:31+08:00 #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
引用和锚点
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 defaults: &defaults adapter: postgres host: localhost development: database: myapp_development <<: *defaults test: database: myapp_test <<: *defaults 以上相当于: defaults: adapter: postgres host: localhost development: database: myapp_development adapter: postgres host: localhost test: database: myapp_test adapter: postgres host: localhost
四、参考
YAML官网
菜鸟教程
python解析YAML 一、准备
安装YAML解析依赖包pip install PyYAML
准备YAML文件(和test.py同目录),语法自行脑补
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 name: 张翠山 age: 40 son: - name: 张无忌 age: 20 sex: 男 GF: - name: 赵敏 age: 20 parent: mother: 群演 father: 汝阳王 - name: 小昭 age: 20 parent: mother: 黛绮丝 father: 韩千叶
二、开始
查看安装的扩展包pip list
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 Package Version ----------------- ---------- astroid 2.3.3 certifi 2019.11.28 chardet 3.0.4 click 7.1.1 idna 2.9 isort 4.3.21 lazy-object-proxy 1.4.3 mccabe 0.6.1 pip 20.0.2 pylint 2.4.4 PyYAML 5.3 requests 2.23.0 setuptools 41.2.0 sh 1.12.14 six 1.14.0 urllib3 1.25.8 wrapt 1.11.2
代码(test.py
)
1 2 3 4 5 6 7 8 9 10 11 12 import os import yaml # 获取文件所在目录 base_dir = os.path.dirname(os.path.realpath('__file__')) # 另一种获取目录的方法 #base_dir = os.getcwd() #print(base_dir) file = open(os.path.join(base_dir, 'config.yaml')) content = yaml.load(file, Loader=yaml.FullLoader) print(content)
跑一下代码python3 test.py
,结果如下(已格式化)
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 { "name": "张翠山", "age": 40, "son": [ { "name": "张无忌", "age": 20, "sex": "男", "GF": [ { "name": "赵敏", "age": 20, "parent": { "mother": "群演", "father": "汝阳王" } }, { "name": "小昭", "age": 20, "parent": { "mother": "黛绮丝", "father": "韩千叶" } } ] } ] }
三、参考
pip
扩展包
YAML教程
yaml.load