YAML简介
Posted on 2015-10-01 20:20 in Django
YAML(尾音类似camel)是一个可读性高,用来表达数据序列化的语言。 在最初的时候YAML表示Yet Another Markup Language,但是现在YAML Ain’t Markup Language。
官方的定义是这样写的:YAML is a human friendly data serialization standard for all programming languages.
可读性好
YAML格式有很好的可读性,对比JSON格式,增加了换行和缩进,就像Python一样。:
name: Vorlin Laruknuzum
sex: Male
class: Priest
title: Acolyte
hp: [32, 71]
sp: [1, 13]
gold: 423
inventory:
- a Holy Book of Prayers (Words of Wisdom)
- an Azure Potion of Cure Light Wounds
- a Silver Wand of Wonder
注释和文档结构
在yaml格式中注释有两种格式单行注释以 # 开始, 多行注释跟C语言一样 /* */
yaml 可以在一个string中包含多个document, 每个文档以三个短横线开始,以三个点结束,不过结束标志并不是必须的。
>>> a = yaml.load_all(""" ... # Play by Play Feed ... ---... time: 20:03:20 ... player: Sammy Sosa ... action: strike (miss) ... ... ... ---... time: 20:03:47 ... player: Sammy Sosa ... action: grand slam ... """) >>> for i in a: ... print i ... {'action': 'strike (miss)', 'player': 'Sammy Sosa', 'time': 72200} {'action': 'grand slam', 'player': 'Sammy Sosa', 'time': 72227}
数据结构和数据类型
在yaml中有三种数据结构Scalar,Sequence,Mapping(标量,序列,字典)
- Scalar
Scalar 的格式很灵活,可以不带引号, 单引号(不需要转义),双引号(需要转义),还可以有多行的形式:
--- |
Hello, world!
Have a line break
--- >
Hello, World!
no line break
更多情况参考 http://www.yaml.org/spec/1.2/spec.html 2.3. Scalars
- Sequence
Sequence 有两种形式,和JSON一样的使用中括号[], 或者是每个元素以短横线和空格("- ")开始。在最开始的例子中就可以看到两种形式。
- Mapping
同样,Mapping也有两种形式,我们直接看例子吧:
>>> yaml.load("""
... main:
... game: hearthstone
... role: {name: Jaina, class: magician}
... """)
{'main': {'game': 'hearthstone', 'role': {'name': 'Jaina', 'class': 'magician'}}}
python 和 yaml
解析和生成yaml都可以用pyyaml库,用法参考上面的例子,主要使用两个函数 load 和 dump。
在实际的使用过程中,一般用yaml格式做配置文件,因为yaml格式的可读性非常好,人工编辑很方便,而且也方便程序读取。
更多资料
yaml格式官网 http://www.yaml.org/
pyyaml http://pyyaml.org/wiki/PyYAML
各种编程语言在实现yaml解析的时候可能对应到本语言的数据类型类型可能不一致, 如果需要更严格的指定数据类型需要了解yaml tags
http://www.yaml.org/spec/1.2/spec.html 2.4. Tags