引用http://www.ibm.com/developerworks/cn/xml/x-cn-yamlintro/的介绍
YAML的适用范围
由于实现简单,解析成本很低,YAML特别适合在脚本语言中使用。列一下现有的语言实现:Ruby,Java,Perl,Python,PHP,OCaml,JavaScript。除了Java,其他都是脚本语言.
YAML比较适合做序列化。因为它是宿主语言数据类型直转的。
YAML做配置文件也不错。比如Ruby on Rails的配置就选用的YAML。对ROR而言,这很自然,也很省事.
由于兼容性问题,不同语言间的数据流转建议现在不要用YAML.
YAML存在的意义
无论多么完美的事物,都需要有对立面,有说“NO”的声音。XML也不例外。当然,站在主流的对立面,需要勇气和智慧。
YAML和XML不同,没有自己的数据类型的定义,而是使用实现语言的数据类型。这一点,有可能是出奇制胜的地方,也可能是一个败笔。如果兼容性保
证的不好的话,YAML数据在不同语言间流转会有问题。如果兼容性好的话,YAML就会成为不同语言间数据流通的桥梁。建议yaml.org设立兼容认证 机制,每个语言的实现必须通过认证。
假如兼容性没问题的话,YAML就太完美了。轻巧,敏捷,高效,简便,通用。这才是理想中的数据模型。当然就现在而言,这还只是个理想。
本文的主题是用python使用yaml,那么我们来看看python中的序列化模块
模块名
|
简介
|
Pickle
|
可以选择性地把串行化对象保存为一个文件
|
cPickle
|
比Pickle 快,不支持Pickler和unPickler
|
Shelve
|
构建在Pickle 和anydbm上,类似字典功能
|
当然还有其他很多:pprint,marshal,zodb…
进入正题yaml
下载和安装pyYaml
pyYaml下载地址:http:///wiki/PyYAML
按照你的操作系统和python下载对应的版本,我的window & python2.5
所以下载http:///download/pyyaml/PyYAML-3.05.win32-py2.5.exe
(for Python 2.5)
安装很容易,一路next.
详细说明(里面有很多的使用例子):http:///wiki/PyYAMLDocumentation
下面只介绍一下简单的使用
1)
生成yaml文件
- import yaml
- document = """
- 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
- """
- print yaml.dump(yaml.load(document))
- #打印由字符转换成python对象的yaml格式信息
- stream = file('document.yaml', 'w')
- yaml.dump(yaml.load(document), stream)
- #写文件 # Write a YAML representation of data to 'document.yaml'.
- print yaml.dump(yaml.load(document))
在这里发现一个蛮有意思的现象,我是用eclipse的dvpy插件的,从代码中拷贝代码出来黏贴到word中的时候,发现python的注释没有黏贴出来。
2)
读取yaml文件
据说:yaml.load is as powerful as pickle. 这是官方的说法,我们就相信他吧。
- stream = file('document.yaml', 'r')
- dict = yaml.load(stream)
- print dict
- #打印所有的yaml数据,其实也就是dict类,《简明_python_教程》里说的字典
- print dict["name"]
- #打印其中的一个key值
yaml.load的作用是把一个yaml格式的文档转换成python对象。
注:上面只是说yaml文件中的”name”正好是dict 类的,所以可以这么取,并不是所有的都这么取,具体看他yaml的格式而定。
3)按照需要选择性地生成python对象
- >>> class Hero:
- ... def __init__(self, name, hp, sp):
- ... self.name = name
- ... self.hp = hp
- ... self.sp = sp
- ... def __repr__(self):
- ... return "%s(name=%r, hp=%r, sp=%r)" % (
- ... self.__class__.__name__, self.name, self.hp, self.sp)
- >>> yaml.load("""
- ... !!python/object:__main__.Hero
- ... name: Welthyr Syxgon
- ... hp: 1200
- ... sp: 0
- ... """)
这里是生成了一个Hero类,属性是name,hp,sp;他是添加了python/object标签,很聪明的一个想法!
YAML tags and Python types(yaml与python的标签对应关系表)
YAML tag
|
Python type
|
Standard YAML tags
|
|
!!null
|
None
|
!!bool
|
bool
|
!!int
|
int
|
!!float
|
float
|
!!binary
|
str
|
!!timestamp
|
datetime.datetime
|
!!omap
|
!!pairs list of pairs
|
!!set
|
set
|
!!str
|
str
|
!!seq
|
list
|
!!map
|
dict
|
Python-specific tags
|
|
!!python/none
|
None
|
!!python/bool
|
bool
|
!!python/str
|
str
|
!!python/unicode
|
unicode
|
!!python/int
|
int
|
!!python/long
|
long
|
!!python/float
|
float
|
!!python/complex
|
complex
|
!!python/list
|
list
|
!!python/tuple
|
tuple
|
!!python/dict
|
dict
|
Complex Python tags
|
|
!!python/name:module.name
|
module.name
|
!!python/module:package.module
|
package.module
|
!!python/object:module.cls
|
module.cls
|
!!python/object/new:module.cls
|
module.cls
|
!!python/object/apply:module.f
|
value
|
关于这些标签的具体使用可以参考
http:///wiki/PyYAMLDocumentation
虽然本人也只是刚刚开始学python,但是我觉得网上的介绍yaml的python中文入门资料太少,所以才显了一下丑。
|