yaml在python上的使用教程详解

YAML是一种容易人类阅读、适合表示程序语言的数据结构、可用于不同程序间交换数据、支持泛型工具、支持串行处理、丰富的表达能力和可扩展性、易于使用的语言。YAML利用缩进或者是explicit indicatior(如{})来表示属性的嵌套,更为直观和simple。

一、YAML的格式

YAML的格式及特点如下:

YAML使用可打印的Unicode字元,可使用UTF-8或UTF-16。
使用空白字元为文件缩排来表示结构;不过不能使用跳格字元(TAB)。
注解由井字号( # )开始,可以出现在一行中的任何位置,而且范围只有一行(也就是一般所谓的单行注解)
每个清单成员以单行表示,并用短杠+空白( -   )起始。或使用方括号( [ ] ),并用逗号+空白( ,   )分开成员。
每个杂凑表的成员用冒号+空白( :   )分开键值和内容。或使用大括号( {   } ),并用逗号+空白( ,   )分开。
杂凑表的键值可以用问号 ( ? )起始,用来明确的表示多个词汇组成的键值。
字串平常并不使用引号,但必要的时候可以用双引号 ( " )或单引号 ( ' )框住。
使用双引号表示字串时,可用倒斜线( \ )开始的跳脱字元(这跟C语言类似)表示特殊字元。
区块的字串用缩排和修饰词(非必要)来和其他资料分隔,有新行保留(preserve)(使用符号 | )或新行折叠(flod)(使用符号 > )两种方式。
在单一档案中,可用连续三个连字号(---)区分多个档案。
另外,还有选择性的连续三个点号( ... )用来表示档案结尾。
重复的内容可使从参考标记星号 ( * )复制到锚点标记( & )。
指定格式可以使用两个惊叹号 ( !! ),后面接上名称。
档案中的单一文件可以使用指导指令,使用方法是百分比符号( % )。有两个指导指令在YAML1.1版中被定义:
 %YAML 指导指令,用来识别文件的YAML版本。
 %TAG 指导指令,被用在URI的字首标记。这个方法在标记节点的型态时相当有用。
YAML再使用逗号及冒号时,后面都必须接一个空白字元。

二、PyYAML的使用

1、安装

python下安装PyYAML模块可以使用YAML ,打开https://pypi.python.org/pypi/PyYAML下载,当前版本3.11 。pypi 站点上对该模块的描述如下:PyYAML features a complete YAML 1.1 parser, Unicode support, pickle support, capable extension API, and sensible error messages 。

可以连网的主机也可以通过pip install pyyaml 或easy_install pyymal 进行安装。

2、yaml.load与yaml.dump方法

该模块提供了一些方法,不过常用的方法只有两个yaml.load和yaml.dump ,以下是一个版本相关的yaml 格式文件

[root@361way yaml]# cat tree.yaml

treeroot:

    branch1:

        name: Node 1

        branch1-1:

            name: Node 1-1

    branch2:

        name: Node 2

        branch2-1:

            name: Node 2-1

yaml.load方法:

# 脚本内容

[root@361way yaml]# cat load.py

import yaml

f = open('tree.yaml')

dataMap = yaml.load(f)

f.close()

print dataMap

# 执行结果如下

[root@361way yaml]# python load.py

{'treeroot': {'branch2': {'branch2-1': {'name': 'Node 2-1'}, 'name': 'Node 2'}, 'branch1': {'branch1-1': {'name': 'Node 1-1'}, 'name': 'Node 1'}}}

yuml.dump方法:

这里还承接上面的脚本,调用里面的dataMap 数据,将其保存一直新的yaml 文件,如下:

# 代码如下:
f = open('newtree.yaml', "w")
yaml.dump(dataMap, f)
f.close()
#newtree.yaml 的结果如下
[root@361way yaml]# cat newtree.yaml
treeroot:
  branch1:
    branch1-1: {name: Node 1-1}
    name: Node 1
  branch2:
    branch2-1: {name: Node 2-1}
    name: Node 2

除此之外,还有safe_load、safe_dump、 load_all 等主法,具体可以通过pydoc yaml 进行查看。

三、yaml、xml与json
1、yaml 与xml

以下是同一内容,分别使用xml 语言标记与 yaml 语言标记:

# xml标记两个site

<site>

    <name>sina</name>

    <url>http://www.111cn.net </url>

</site>

<site>

    <name>google</name>

    <url>http://www.91it.org</url>

</site>

# 使用yaml标记两个site

---

site:

    name: sina

    url : http://www.111cn.net 

---

site:

    name: google

    url : http://www.91it.org

# 使用yaml标记两个site

---

site: {name: sina, url: http://www.111cn.net }

---

site: {name: google, url: http://www.111cn.net}

从读取查看的角度来看,有没有发现yaml 相对xml 语言的优势。

2、yaml 与 json

准确的说json 应该算是yaml 标准下的一个字集,通过python语句可以很方面的在两者之间进行转换。

a、转换YAML到JSON

# python -c 'import sys, yaml, json; json.dump(yaml.load(sys.stdin), sys.stdout, indent=4)' < file.yaml > file.json

或

#!/usr/bin/env python

import yaml,json

yml = """

---

  foo: bar

"""

data = yaml.load(yml)

json = json.dumps(data)

print(json)

b、转换JSON到YAML

# python -c 'import sys, yaml, json; yaml.dump(json.load(sys.stdin), sys.stdout, default_flow_style=False)' < file.json > file.yaml

或

#!/usr/bin/env python

import json,yaml

str = '{ "foo": "bar" }'

data = json.loads(str)

yml = yaml.safe_dump(data)

print(yml)

注:很多情况下,甚至可以直接将json后缀的文件改为yaml 后缀,使用yaml 语言直接解析。

四、yaml 在python语言中的应用

yaml 语言在很多优秀的python 程序中都有使用,比如运维工程师经常使用的两个自动化工作saltstack 与 Ansible 。更多PyYAML 模块的用法,也可以查看其官方wiki 页

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索文件
, 语言
, 模块
格式
python爬虫教程详解、yaml语法详解、k8s yaml文件详解、app.yaml语法详解、python yaml,以便于您获取更多的相关知识。

时间: 2024-09-03 22:27:06

yaml在python上的使用教程详解的相关文章

又拍云异步上传实例教程详解_php实例

网站静态文件存储在又拍云,之前上传是通过又拍云的的FORM API进行. 当产品经理歪着脑袋走向你的时候,哎呀呀,这用户信息这里,上传要无刷新的效果了.  这他***,自己偷偷抱怨一会会,怎么搞喃?听说这家伙要一个好听的名字,异步上传,高大上档次挺像我的. 根据我们的观察,此处有两个重点: ①.怎么实现异步上传 ②.怎么上传到又 拍 云 首先我们要实现异步上传,就需要利用js里面的FormData对象,据说,这家伙不支持ie6 7的,ie8就不太清楚了,据说哈,说错了不负责的. 不过喃,我们也不

Python日期操作入门教程详解

1. 日期输出格式化 所有日期.时间的api都在datetime模块内. 1. datetime => string 1 now = datetime.datetime.now()  2 now.strftime('%Y-%m-%d %H:%M:%S') 输出2012-03-05 16:26:23.870105 strftime是datetime类的实例方法. 2. string => datetime 1 t_str = '2012-03-05 16:26:23' 2 d = datetim

图文教程:详解Fireworks中的动画制作

教程|详解 有过FLASH动画制作基础的朋友一定知道,在FLASH中将绘制的图像转换成的"图像元件"或"动画元件"是可以通过软件的内建指令,产生运动及其它变化的效果.而在Fireworks中也沿用了这种动画制作方式,从而大大减省了GIF动画制作时的繁琐性.而在本篇教材中,我们也只针对软件直接生成的动画效果进行分析,不对手工分桢的动画制作进行讨论. 一.动画的基本运动 在Fireworks中,动画的运动方式可分为四个基本动作: 1.直线运动:图像由A点直线移动至B点:

Python中的下划线详解

  这篇文章主要介绍了Python中的下划线详解,本文讲解了单个下划线直接做变量名.单下划线前缀的名称.双下划线前缀的名称等内容,需要的朋友可以参考下 这篇文章讨论Python中下划线_的使用.跟Python中很多用法类似,下划线_的不同用法绝大部分(不全是)都是一种惯例约定. 一. 单个下划线直接做变量名(_) 主要有三种情况: 1. 解释器中 _符号是指交互解释器中最后一次执行语句的返回结果.这种用法最初出现在CPython解释器中,其他解释器后来也都跟进了. 代码如下: >>> _

Python中的默认参数详解

  这篇文章主要介绍了Python中的默认参数详解,本文讲解了默认参数的基本原理.如何正确地使用可变参数等内容,需要的朋友可以参考下 文章的主题 不要使用可变对象作为函数的默认参数例如 list,dict,因为def是一个可执行语句,只有def执行的时候才会计算默认默认参数的值,所以使用默认参数会造成函数执行的时候一直在使用同一个对象,引起bug. 基本原理 在 Python 源码中,我们使用def来定义函数或者方法.在其他语言中,类似的东西往往只是一一个语法声明关键字,但def却是一个可执行的

Spring整合MyBatis(Maven+MySQL)图文教程详解_java

一. 使用Maven创建一个Web项目 为了完成Spring4.x与MyBatis3.X的整合更加顺利,先回顾在Maven环境下创建Web项目并使用MyBatis3.X,第一.二点内容多数是回顾过去的内容 . 1.2.点击"File"->"New"->"Other"->输入"Maven",新建一个"Maven Project",如下图所示: 1.2.请勾选"Create a si

Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)_javascript技巧

什么是组件? 组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能.在有些情况下,组件也可以是原生 HTML 元素的形式,以 is 特性扩展. 接下来给大家介绍vuejs单向绑定.双向绑定.列表渲染.响应函数基础知识,具体详情如下所示: (一)单向绑定 <div id="app"> {{ message }} </div> <sc

Yii2 rbac权限控制之rule教程详解_php实例

在我们之前Yii2搭建后台并实现rbac权限控制完整实例教程中,不知道你曾经疑惑过没有一个问题,rule表是做什么的,为什么在整个过程中我们都没有涉及到这张表? 相信我不说,部分人也都会去尝试,或百度或google,到头来也会竹篮打水,这部分讲解的内容少之又少啊! 对于一般的权限系统而言,我们之前做的rbac一般情况下是足够的,即时没有rule,相信你也能实现我们用rule实现的功能. 我们就以官网的例子给出一个具体的操作教程,看看这个神秘的rule到底是做什么的! 看需求: 我们有管理员和普通

python之Socket网络编程详解_python

什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系.在数学上,网络是一种图,一般认为专指加权图.网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类型的实际问题中抽象出来的模型.在计算机领域中,网络是信息传输.接收.共享的虚拟平台,通过它把各个点.面.体的信息联系到一起,从而实现这些资源的共享.网络是人类发展史来最重要的发明,提高了科技和人类社会的发展. 网络通信的三要素 IP地址 用来表示一台独立的主机 特殊的IP地址 127.0.0.1或称localhost(表示本地回环