Yhzhtk's Blog

(热爱技术,高效Code)     归档  标签  源码  关于 


直观全面的配置文件格式YAML

2013-07-09    yaml  python 


1 概念
        YAML是一种人们可以轻松阅读的数据序列化格式,并且它非常适合对动态编程语言中使用的数据类型进行编码。YAML是YAML Ain't Markup Language简写,和GNU("GNU's Not Unix!")一样,YAML是一个递归着说“不”的名字。不同的是,GNU对UNIX说不,YAML说不的对象是XML。YAML不是XML。它可以用作数据序列,配置文件,log文件,Internat信息和过滤。
2 优点
        YAML的可读性好。 
        YAML和脚本语言的交互性好。 
        YAML使用实现语言的数据类型。 
        YAML有一个一致的信息模型。 
        YAML易于实现。
3 YAML的适用范围
        由于实现简单,解析成本很低,YAML特别适合在脚本语言中使用。列一下现有的语言实现:Ruby,Java,Perl,Python,PHP,OCaml,JavaScript。除了Java,其他都是脚本语言. 
        YAML比较适合做序列化。因为它是宿主语言数据类型直转的。 
        YAML做配置文件也不错。比如Ruby on Rails的配置就选用的YAML。对ROR而言,这很自然,也很省事. 
        由于兼容性问题,不同语言间的数据流转建议现在不要用YAML. 
4 YAML不足
        YAML和XML不同,没有自己的数据类型的定义,而是使用实现语言的数据类型。这一点,有可能是出奇制胜的地方,也可能是一个败笔。如果兼容性保证的不好的话,YAML数据在不同语言间流转会有问题。
        假如兼容性没问题的话,YAML就太完美了。轻巧,敏捷,高效,简便,通用。
5 JYaml简介
        JYAML是YAML的Java实现。YAML使用实现语言的数据类型。我们看一下一些JYaml支持的Java数据类型:
        原始数据和封装类(比如int,java.lang.Integer)、JavaBean兼容对象(Structure支持)、Collection (sequence支持List 、Set)、Map (map支持)、Arrays (sequence支持) 、         BigInteger 和BigDecimal 、Date。

参考文献:
1、《YAML 简介》 http://www.ibm.com/developerworks/cn/xml/x-cn-yamlintro/index.html
2、《YAML 对 XML 的改进》http://www.ibm.com/developerworks/cn/xml/x-matters/part23/
3、http://jyaml.sourceforge.net/
4、http://www.yaml.org/
以上转自:http://www.cnblogs.com/dbasys/archive/2007/06/11/2127620.html

看了YAML的概念和优缺点,我发现确实是用做配置文件的很不错的选择,结合工作中用到的配置文件来对比一下:

properties 一行一条资源,很直观,配置很方便,但是功能很单一,不能有嵌套关系
xml 需要XML标签来标记,能表示任何数据结构,但是写配置文件会感觉很复杂,不直观
yaml 这个正好集成了以上二者的优点,很直观显示,又能表示全面配置属性关系

下面学习YAML的基本语法,拿Python示例吧,使用前需要安装PyYaml

#coding: utf-8
'''
Created on 2013-6-8
@author: yh
'''

import yaml

y = {
    'name': "The Cloak 'Colluin'",
    'depth': 5,
    'rarity': 45,
    'weight': 10,
    'cost': 50000,
    'flags': [
        'INT',
        'WIS',
        'SPEED',
        'STEALTH'
    ]
}
# 将对象序列化为字符串
print yaml.dump(y)

ystr = '''name: Tom Smith
age: 37
spouse:
   name: Jane Smith0
   age: 25
   love: [red, yellow]
children:
 -  name: Jimmy Smith1
    age: 15
 -  name: Jenny Smith2
    age: 12'''

# 加载yaml字符串为对象,加载后默认是个Dict,直接用Dict的操作即可
x = yaml.load(ystr)
print x
print x['spouse']['love'][0]
print x['children'][1]['name']
运行结果如下:
cost: 50000
depth: 5
flags: [INT, WIS, SPEED, STEALTH]
name: The Cloak 'Colluin'
rarity: 45
weight: 10

{'age': 37, 'spouse': {'age': 25, 'love': ['red', 'yellow'], 'name': 'Jane Smith0'}, 'name': 'Tom Smith', 'children': [{'age': 15, 'name': 'Jimmy Smith1'}, {'age': 12, 'name': 'Jenny Smith2'}]}
red
Jenny Smith2

        由此可以看出,导入yaml包之后,使用yaml.dump就可以将对象序列化为字符串,使用yaml.load就可以加载文件或者字符串的yaml数据。加载yaml字符串为对象,加载后默认是个Dict,当成一个Dict使用就行啦。

        注意:缩进长度可以任意,但是一级内的缩进必须一致,在属性和值的冒号后面需要有空格,所有的字符串不能有引号,使用 - 与 - 对应 或者 [,] 均可以表示List。





Load Disqus comments, wait a moment..

©2013 首页   关于     View me on GitHub Powered by Jekyll & Bootstrap 知识共享许可协议