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..

分类标签

jekyll3   编码1   windows1   bootstrap1   git3   删除1   命令3   python11   ide1   学习笔记3   实例分析1   mp3-tag1   github1   gravatar1   goagent1   翻墙1   C#4   找茬工具1   微博自动评论1   电脑监控1   备份1   云搜索1   wxPython1   py2exe1   yaml1   Eric1   PyQt1   Django1   设计模式5   翻译4   单例1   工厂1   抽象工厂1   生成器1   原型1   适配器1   桥接1   组合1   装饰1   外观1   享元1   代理1   MVC1   观察者1   状态1   策略1   模板1   访问者1   职责链1   解释器1   迭代器1   中介者1   备忘录1   js1   resize bar1   geohash1   口琴1   rpm安装gitlab1   CentOs1   WordPress1   数据库1   读脏数据1   丢失的修改1   不可重复读1   幻影读1   1   隔离1   思维导图1   事务1   笔记迁移1   note1   issue1  

最新博文

最新评论

Feed订阅


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