YAML实践指南:5:python中的YAML文件格式

在前面的文章中介绍了YAML使用的示例,以及如何使用python的pyyaml模块加载YAML文件并并行展示,这篇文章继续使用前文的示例代码和示例yaml文件进行说明。

执行代码

liumiaocn:yaml liumiao$ cat printyaml.py 
#!/usr/bin/env python

import sys,yaml

yamlfilename=sys.argv[1]

with open(yamlfilename,'r') as filehandle:
  print(yaml.load(filehandle.read()))
liumiaocn:yaml liumiao$

注释写法

知识点:

  • 单行注释:单行注释使用#进行标记,可以在单行的任何位置开始注释的内容
  • 多行注释:不提供特殊的多行注释,使用多行行首的单行注释#实现多行注释的需求
    键/值方式:使用冒号进行分隔
    开始符号:---用于表示开始的符号,在一个文件中包含多个YAML设定的时候使用非常常见。
    结束符号:…用于表示yaml文件结束
  • YAML示例
liumiaocn:yaml liumiao$ cat demo/yamlcomment.yml 
--- #Yaml sample usage: dictionary & comment

# Yaml Sample usage
# key/value pair
# name and greeting messages

name: liumiaocn
greetingmessages: hello
...
liumiaocn:yaml liumiao$
  • 执行确认
liumiaocn:yaml liumiao$ ./printyaml.py demo/yamlcomment.yml 
{'name': 'liumiaocn', 'greetingmessages': 'hello'}
liumiaocn:yaml liumiao$

执行之后,python中显示的数据结构信息中去除了注释和开始结尾等信息,只留下了基本的数据相关的信息。

键/值对象的{}写法

知识点:

  • 键/值方式:也可使用{}结合逗号进行表达
  • YAML示例
liumiaocn:yaml liumiao$ cat demo/yamldic.yml 
--- #Yaml sample usage: dictionary & comment

# Yaml Sample usage
# key/value pair
# name and greeting messages

{name: liumiaocn, greetingmessages: hello}
...
liumiaocn:yaml liumiao$ 
  • 执行确认
liumiaocn:yaml liumiao$ ./printyaml.py demo/yamldic.yml 
{'name': 'liumiaocn', 'greetingmessages': 'hello'}
liumiaocn:yaml liumiao$ 

字符串类型:单引号/双引号/无引号

知识点:

  • 单引号与双引号:字符串类型可以不使用单引号和双引号,使用单引号和双引号与不使用的时候在特殊字符及其转义的时候有些细微的区别。
  • YAML示例
liumiaocn:yaml liumiao$ cat demo/stringquote.yml 
--- #Yaml sample usage: dictionary & comment

# Yaml Sample usage
# key/value pair
# name and greeting messages

name: liumiaocn
greetingmessages: hello \n in a new line
greetingmsg2: "message with double quotation \n in a new line"
greetingmsg3: 'message with single quotation \n in a new line'
...
liumiaocn:yaml liumiao$ 
  • 执行确认
liumiaocn:yaml liumiao$ ./printyaml.py demo/stringquote.yml 
{'greetingmessages': 'hello \\n in a new line', 'name': 'liumiaocn', 'greetingmsg2': 'message with double quotation \n in a new line', 'greetingmsg3': 'message with single quotation \\n in a new line'}
liumiaocn:yaml liumiao$ 

列表

知识点:

  • 支持列表类型数据
  • YAML示例
liumiaocn:yaml liumiao$ cat demo/array.yml 
---
names: [Liumiaocn, Michael]
greetings:
  - Welcome
  - to
  - YAML
...
liumiaocn:yaml liumiao$
  • 执行确认
liumiaocn:yaml liumiao$ ./printyaml.py demo/array.yml 
{'names': ['Liumiaocn', 'Michael'], 'greetings': ['Welcome', 'to', 'YAML']}
liumiaocn:yaml liumiao$ 

列表与键/值的嵌套

知识点:

  • 组合数据类型:支持键/值方式和列表类型,并可进行嵌套组合
  • YAML示例
liumiaocn:yaml liumiao$ cat demo/composed.yml 
---
names: 
  - LiuMiaocn
  - Michael
greetings:
  message1: Welcome
  message2: to
  message3: YAML
...
liumiaocn:yaml liumiao$ 
  • 执行确认
liumiaocn:yaml liumiao$ ./printyaml.py demo/composed.yml 
{'names': ['LiuMiaocn', 'Michael'], 'greetings': {'message3': 'YAML', 'message2': 'to', 'message1': 'Welcome'}}
liumiaocn:yaml liumiao$ 

基本数据类型

知识点:

  • 基本数据类型:支持整型、浮点型、时间戳类型、Null等基本数据类型
  • YAML示例
liumiaocn:yaml liumiao$ cat demo/basictype.yml 
---
# string
stringvar: hello this is a string

# boolean Yes == True 
boolvar: Yes

# integer
intvar: 1001

# timestamp
timevar: 2019-07-10 06:05:01 

# Null
nullvars:
  - nullvar: null
  - Nullvar: Null
...
liumiaocn:yaml liumiao$
  • 执行确认
liumiaocn:yaml liumiao$ ./printyaml.py demo/basictype.yml 
{'intvar': 1001, 'timevar': datetime.datetime(2019, 7, 10, 6, 5, 1), 'boolvar': True, 'nullvars': [{'nullvar': None}, {'Nullvar': None}, {'thenullvar': None}], 'stringvar': 'hello this is a string'}
liumiaocn:yaml liumiao$ 
  • 布尔类型的True/False
    除了True/False,还有多种可以在YAML中表示类似的方式,详细可参看如下示例
liumiaocn:yaml liumiao$ cat demo/booleanvar.yml 
---
# boolean value :false
falsevar: false
Falsevar: False
FALSEvar: FALSE
novar: no
Novar: No
NOvar: NO
offvar: off
Offvar: Off
OFFvar: OFF

# boolean value :true
truevar: true
Truevar: True
TRUEvar: TRUE
yesvar:  yes
Yesvar:  Yes
YESvar:  YES
onvar:   on
Onvar:   On
ONvar:   ON
liumiaocn:yaml liumiao$
  • 执行确认
liumiaocn:yaml liumiao$ ./printyaml.py demo/booleanvar.yml 
{'falsevar': False, 'FALSEvar': False, 'ONvar': True, 'Truevar': True, 'YESvar': True, 'novar': False, 'offvar': False, 'onvar': True, 'Yesvar': True, 'TRUEvar': True, 'Falsevar': False, 'Onvar': True, 'truevar': True, 'Novar': False, 'Offvar': False, 'yesvar': True, 'NOvar': False, 'OFFvar': False}
liumiaocn:yaml liumiao$ 

较长的文本描述

知识点:

  • 较长的描绘性说明:使用|与>以及>-来处理常见的对于较长的描绘性说明的要求
  • YAML示例
liumiaocn:yaml liumiao$ cat demo/blockmessage.yml 
---
multiplelinemessages: |
  sow a thought, reap an action; 
  sow an action, reap a habit; 

  sow a habit, reap a character; 
  sow a character, reap a destiny.

sinlelinemessagewithbr: >
  sow a thought, reap an action; 
  sow an action, reap a habit; 

  sow a habit, reap a character; 
  sow a character, reap a destiny.

singlelinemessagewithoutbr: >- 
  sow a thought, reap an action; 
  sow an action, reap a habit; 

  sow a habit, reap a character; 
  sow a character, reap a destiny.
...
liumiaocn:yaml liumiao$
  • 执行确认
liumiaocn:yaml liumiao$ ./printyaml.py demo/blockmessage.yml 
{'multiplelinemessages': 'sow a thought, reap an action; \nsow an action, reap a habit; \n\nsow a habit, reap a character; \nsow a character, reap a destiny.\n', 'singlelinemessagewithoutbr': 'sow a thought, reap an action;  sow an action, reap a habit; \nsow a habit, reap a character;  sow a character, reap a destiny.', 'sinlelinemessagewithbr': 'sow a thought, reap an action;  sow an action, reap a habit; \nsow a habit, reap a character;  sow a character, reap a destiny.\n'}
liumiaocn:yaml liumiao$ 

用锚点和引用描述重复性内容

知识点:

  • 重复性内容:可以使用锚点标记&和应用标记*结合使用可以处理重复性的内容
  • YAML示例
liumiaocn:yaml liumiao$ cat demo/anchors.yml 
---
defaultgreeting: &defaultgreetingref
  name: &nameref Liumiaocn
  message: Hello

# override message column
welcomegreeting:
  <<: *defaultgreetingref
  message: Welcome

# add new column
newgreeting:
  newname: *nameref
  newmessage: New Message Information
...
liumiaocn:yaml liumiao$

注意:&和*虽然可以进行锚点的设定和引用,但仅限于此,如果希望实现其他语言中的concat或者+重载符所实现的简单作用,在YAML当前的1.2规范中还是无法实现的。在YAML中做基础的数据的描述,至于使用这些数据进行何种运算,连接也好查询也好,这些在大部分编程语言中都非常简单。

  • 执行确认
liumiaocn:yaml liumiao$ ./printyaml.py demo/anchors.yml 
{'newgreeting': {'newname': 'Liumiaocn', 'newmessage': 'New Message Information'}, 'defaultgreeting': {'message': 'Hello', 'name': 'Liumiaocn'}, 'welcomegreeting': {'message': 'Welcome', 'name': 'Liumiaocn'}}
liumiaocn:yaml liumiao$

强制类型转换

知识点:

  • 强制类型转换:可以使用!!用于强制类型转换
  • YAML示例
liumiaocn:yaml liumiao$ cat demo/convert.yml 
---
name: Liumiaocn
greeting: Hello
canread: Yes
yesmessage: !!str Yes
id: '1001'
integerid: !!int '1001'
...
liumiaocn:yaml liumiao$
  • 执行确认
liumiaocn:yaml liumiao$ ./printyaml.py demo/convert.yml 
{'integerid': 1001, 'name': 'Liumiaocn', 'canread': True, 'yesmessage': 'Yes', 'greeting': 'Hello', 'id': '1001'}
liumiaocn:yaml liumiao$ 

错误格式

知识点:

  • 空白字符限制:在使用逗号及冒号时,后须接一个空白字符
  • 缩进:不支持Tab
liumiaocn:yaml liumiao$ cat demo/errorformat.yml 
---
# without space behind person:
person:{name: Liumiaocn, id: 1001}
greetings:
# use tab rather than space
	message: Hello
...
liumiaocn:yaml liumiao$

上述YAML文件存在格式问题:

  • 问题1:person:后面缺一个空格
  • 问题2:message:前面使用的是Tab而不是空格

执行确认

liumiaocn:yaml liumiao$ ./printyaml.py demo/errorformat.yml 
Traceback (most recent call last):
  File "./printyaml.py", line 8, in <module>
...省略
yaml.scanner.ScannerError: mapping values are not allowed here
  in "<string>", line 3, column 28:
    person:{name: Liumiaocn, id: 1001}
                               ^
liumiaocn:yaml liumiao$ 
淼叔 CSDN认证博客专家 神经网络 TensorFlow NLP
资深架构师,PMP、OCP、CSM、HPE University讲师,EXIN DevOps Professional与DevOps Master认证讲师,曾担任HPE GD China DevOps & Agile Leader,帮助企业级客户提供DevOps咨询培训以及实施指导。熟悉通信和金融领域,有超过十年金融外汇行业的架构设计、开发、维护经验,在十几年的IT从业生涯中拥有了软件开发设计领域接近全生命周期的经验和知识积累,著有企业级DevOps技术与工具实战。
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页