YAML 使用指南

因为最近做项目需要用到配置项,想了想之前接触过的XML和JSON都有点不方便,所以试试看YAML。本篇指南完全基于官方文档

YAML(尾音类似camel)是一个可读性高,用来表达数据序列化的语言。 在最初的时候YAML表示Yet Another Markup Language,但是现在YAML Ain’t Markup Language。

官方的定义是这样写的:YAML is a human friendly data serialization standard for all programming languages.

安装

在OS X 上直接在终端中执行如下指令即可 pip install PyYAML

使用

装载YAML

import yaml

load

The function yaml.load converts a YAML document to a Python object. 使用 yaml.load 方法可以将一个 YAML 文档转换成一个 Python 对象。 在文件编码方面推荐使用 utf-8。 >>> yaml.load(u""" … hello: Привет! … “”") # In Python 3, do not use the ‘u’ prefix

{'hello': u'\u041f\u0440\u0438\u0432\u0435\u0442!'}

>>> stream = file('document.yaml', 'r')    # 'document.yaml' contains a single YAML document.
>>> yaml.load(stream)
[...]    # A Python object corresponding to the document.

当然,也可以使用 yaml.load_all 一次性完成所有 YAML 文档的装载。 同时,YAML 支持任何 Python 的结构,比如: >>> yaml.load(""" … none: [~, null] … bool: [true, false, on, off] … int: 42 … float: 3.14159 … list: [LITE, RES_ACID, SUS_DEXT] … dict: {hp: 13, sp: 5} … “”")

{'none': [None, None], 'int': 42, 'float': 3.1415899999999999,
'list': ['LITE', 'RES_ACID', 'SUS_DEXT'], 'dict': {'hp': 13, 'sp': 5},
'bool': [True, False, True, False]}

dump

The yaml.dump function accepts a Python object and produces a YAML document. 正好与 load 相反,非常灵活,支持的类型也很多,不展开说了。 >>> print yaml.dump({‘name’: ‘Silenthand Olleander’, ‘race’: ‘Human’, … ‘traits’: [‘ONE_HAND’, ‘ONE_EYE’]})

name: Silenthand Olleander
race: Human
traits: [ONE_HAND, ONE_EYE]

同时,yaml.dump 方法也支持传入第二个参数,可以使一个文本文件或者是一个二进制文件,yaml.dump 方法会将生成的 YAML 文档写入文件。否则 yaml.dump 会返回生成的 YAML 文档。

YAML 语法

语法官方文档上提供了其中中他两个参考的地址,在此附上其中一个比较有用的,里面提供了非常多的例子,可以直接参照使用:

Chapter 2 of the YAML specification

YAML 对象

class MyYAMLObject(YAMLObject):
    yaml_loader = Loader
    yaml_dumper = Dumper

    yaml_tag = u'...'
    yaml_flow_style = ...

    @classmethod
    def from_yaml(cls, loader, node):
        # ...
        return data

    @classmethod
    def to_yaml(cls, dumper, data):
        # ...
        return node