您的位置:首页 > 编程语言 > Python开发

在python中使用Yaml

2008-09-06 13:41 197 查看
引用http://www.ibm.com/developerworks/cn/xml/x-cn-yamlintro/的介绍

YAML的适用范围

由于实现简单,解析成本很低,YAML特别适合在脚本语言中使用。列一下现有的语言实现:Ruby,Java,Perl,Python,PHP,OCaml,JavaScript。除了Java,其他都是脚本语言.

YAML比较适合做序列化。因为它是宿主语言数据类型直转的。

YAML做配置文件也不错。比如RubyonRails的配置就选用的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[/b]


[/b]


下载和安装pyYaml[/b]


pyYaml下载地址:http://pyyaml.org/wiki/PyYAML

按照你的操作系统和python下载对应的版本,我的window&python2.5

所以下载http://pyyaml.org/download/pyyaml/PyYAML-3.05.win32-py2.5.exe
(forPython2.5)

安装很容易,一路next.

详细说明(里面有很多的使用例子):http://pyyaml.org/wiki/PyYAMLDocumentation

下面只介绍一下简单的使用[/b]

1)
生成yaml文件

importyaml

document="""
name:VorlinLaruknuzum
sex:Male
class:Priest
title:Acolyte
hp:[32,71]
sp:[1,13]
gold:423
inventory:
-aHolyBookofPrayers(WordsofWisdom)
-anAzurePotionofCureLightWounds
-aSilverWandofWonder
"""
printyaml.dump(yaml.load(document))
#打印由字符转换成python对象的yaml格式信息

stream=file('document.yaml','w')
yaml.dump(yaml.load(document),stream)
#写文件#WriteaYAMLrepresentationofdatato'document.yaml'.
printyaml.dump(yaml.load(document))

在这里发现一个蛮有意思的现象,我是用eclipse的dvpy插件的,从代码中拷贝代码出来黏贴到word中的时候,发现python的注释没有黏贴出来。

2)
读取yaml文件

据说:yaml.loadisaspowerfulaspickle.这是官方的说法,我们就相信他吧。

stream=file('document.yaml','r')
dict=yaml.load(stream)
printdict
#打印所有的yaml数据,其实也就是dict类,《简明_python_教程》里说的字典
printdict["name"]
#打印其中的一个key值

yaml.load的作用是把一个yaml格式的文档转换成python对象。

注:上面只是说yaml文件中的”name”正好是
dict
类的,所以可以这么取,并不是所有的都这么取,具体看他yaml的格式而定。

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

>>>classHero:
...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:WelthyrSyxgon
...hp:1200
...sp:0
...""")

这里是生成了一个Hero类,属性是name,hp,sp;他是添加了python/object标签,很聪明的一个想法!

YAMLtagsandPythontypes(yaml与python的标签对应关系表)

YAMLtag
Pythontype
StandardYAMLtags
!!null
None
!!bool
bool
!!int
int
!!float
float
!!binary
str
!!timestamp
datetime.datetime
!!omap
!!pairslistofpairs
!!set
set
!!str
str
!!seq
list
!!map
dict
Python-specifictags
!!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
ComplexPythontags
!!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

虽然本人也只是刚刚开始学python,但是我觉得网上的介绍yaml的python中文入门资料太少,所以才显了一下丑。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: