在python中使用Yaml

来源:互联网 发布:sql 添加触发器 编辑:程序博客网 时间:2024/05/18 13:31
引用http://www.ibm.com/developerworks/cn/xml/x-cn-yamlintro/的介绍

YAML的适用范围

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

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

YAML做配置文件也不错。比如Ruby on Rails的配置就选用的YAML。对ROR而言,这很自然,也很省事.

由于兼容性问题,不同语言间的数据流转建议现在不要用YAML.

YAML存在的意义

无论多么完美的事物,都需要有对立面,有说“NO”的声音。XML也不例外。当然,站在主流的对立面,需要勇气和智慧。

YAMLXML不同,没有自己的数据类型的定义,而是使用实现语言的数据类型。这一点,有可能是出奇制胜的地方,也可能是一个败笔。如果兼容性保证的不好的话,YAML数据在不同语言间流转会有问题。如果兼容性好的话,YAML就会成为不同语言间数据流通的桥梁。建议yaml.org设立兼容认证 机制,每个语言的实现必须通过认证。

假如兼容性没问题的话,YAML就太完美了。轻巧,敏捷,高效,简便,通用。这才是理想中的数据模型。当然就现在而言,这还只是个理想。



本文的主题是用python使用yaml,那么我们来看看python中的序列化模块

模块名

简介

Pickle

可以选择性地把串行化对象保存为一个文件

cPickle

Pickle快,不支持PicklerunPickler

Shelve

构建在Pickleanydbm上,类似字典功能

当然还有其他很多: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

下面只介绍一下简单的使用

1) 生成yaml文件

  1. import yaml
  2. document = """
  3. name: Vorlin Laruknuzum
  4. sex: Male
  5. class: Priest
  6. title: Acolyte
  7. hp: [32, 71]
  8. sp: [1, 13]
  9. gold: 423
  10. inventory:
  11. - a Holy Book of Prayers (Words of Wisdom)
  12. - an Azure Potion of Cure Light Wounds
  13. - a Silver Wand of Wonder
  14. """
  15. print  yaml.dump(yaml.load(document))
  16. #打印由字符转换成python对象的yaml格式信息
  17. stream = file('document.yaml''w')
  18. yaml.dump(yaml.load(document), stream)
  19. #写文件    # Write a YAML representation of data to 'document.yaml'.
  20. print yaml.dump(yaml.load(document))  

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




2) 读取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值

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. >>> yaml.load("""
  10. ... !!python/object:__main__.Hero
  11. ... name: Welthyr Syxgon
  12. ... hp: 1200
  13. ... sp: 0
  14. ... """)

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

 

 

 

 

YAML tags and Python typesyamlpython的标签对应关系表)

 

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

 

虽然本人也只是刚刚开始学python,但是我觉得网上的介绍yamlpython中文入门资料太少,所以才显了一下丑。





原创粉丝点击