GAE

python 中的ymal文件

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://pyyaml.org/wiki/PyYAML
按照你的操作系统和python下载对应的版本,我的window & python2.5
所以下载http://pyyaml.org/download/pyyaml/PyYAML-3.05.win32-py2.5.exe (for Python 2.5)

安装很容易,一路next.
详细说明(里面有很多的使用例子):http://pyyaml.org/wiki/PyYAMLDocumentation
下面只介绍一下简单的使用
<!–[if !supportLists]–>1)  <!–[endif]–>生成yaml文件

1.import yaml
2.3.document = “””
4.name: Vorlin Laruknuzum
5.sex: Male
6.class: Priest
7.title: Acolyte
8.hp: [32, 71]
9.sp: [1, 13]
10.gold: 423
11.inventory:
12.- a Holy Book of Prayers (Words of Wisdom)
13.- an Azure Potion of Cure Light Wounds
14.- a Silver Wand of Wonder
15.”””
16.print  yaml.dump(yaml.load(document))
17.#打印由字符转换成python对象的yaml格式信息18.19.stream = file(‘document.yaml’, ‘w’)
20.yaml.dump(yaml.load(document), stream)
21.#写文件    # Write a YAML representation of data to ‘document.yaml’.22.print yaml.dump(yaml.load(document))
在这里发现一个蛮有意思的现象,我是用eclipse的dvpy插件的,从代码中拷贝代码出来黏贴到word中的时候,发现python的注释没有黏贴出来。

 

 

 

 

 

<!–[if !supportLists]–>2)  <!–[endif]–>读取yaml文件
据说:yaml.load is as powerful as pickle.  这是官方的说法,我们就相信他吧。

 

 

1.stream = file(‘document.yaml’, ‘r’)
2.dict =  yaml.load(stream)
3.print dict
4.#打印所有的yaml数据,其实也就是dict类,《简明_python_教程》里说的字典5.print dict[“name”]
6.#打印其中的一个key值7.yaml.load的作用是把一个yaml格式的文档转换成python对象。
注:上面只是说yaml文件中的”name”正好是dict类的,所以可以这么取,并不是所有的都这么取,具体看他yaml的格式而定。

 

3)按照需要选择性地生成python对象

 

 

1.>>> class Hero:
2….     def __init__(self, name, hp, sp):
3….         self.name = name
4….         self.hp = hp
5….         self.sp = sp
6….     def __repr__(self):
7….         return “%s(name=%r, hp=%r, sp=%r)” % (
8….             self.__class__.__name__, self.name, self.hp, self.sp)
9.10.>>> yaml.load(“””
11…. !!python/object:__main__.Hero
12…. name: Welthyr Syxgon
13…. hp: 1200
14…. sp: 0
15…. “””)
16.

这里是生成了一个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://pyyaml.org/wiki/PyYAMLDocumentation

Leave a Reply

Your email address will not be published. Required fields are marked *