python 中的ymal文件

    技术2025-12-25  5

    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 下载和安装pyYamlpyYaml下载地址: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 yaml2.3.document = """4.name: Vorlin Laruknuzum5.sex: Male6.class: Priest7.title: Acolyte8.hp: [32, 71]9.sp: [1, 13]10.gold: 42311.inventory:12.- a Holy Book of Prayers (Words of Wisdom)13.- an Azure Potion of Cure Light Wounds14.- a Silver Wand of Wonder15."""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 dict4.#打印所有的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 = name4....         self.hp = hp5....         self.sp = sp6....     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__.Hero12.... name: Welthyr Syxgon13.... hp: 120014.... sp: 015.... """)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

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

     

     

    本文来自博客,转载请标明出处:http://blog.csdn.net/xiao_qiang_/archive/2008/09/06/2891119.aspx

    最新回复(0)