day5模块学习--yaml文件处理
yaml文件处理(http://pyyaml.org/wiki/PyYAMLDocumentation)
摘要: 本文讲的是yaml在python上的使用教程详解, YAML是一种容易人类阅读、适合表示程序语言的数据结构、可用于不同程序间交换数据、支持泛型工具、支持串行处理、丰富的表达能力和可扩展性、易于使用的语言。YAML利用缩进或者是explicit indicatior(如{})来表示属。
YAML是一种容易人类阅读、适合表示程序语言的数据结构、可用于不同程序间交换数据、支持泛型工具、支持串行处理、丰富的表达能力和可扩展性、易于使用的语言。YAML利用缩进或者是explicit indicatior(如{})来表示属性的嵌套,更为直观和simple。
YAML用来做配置文件,很多项目的配置文件都是yaml文件格式。
一、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格式文件:
yaml文件:
treeroot: branch1: name: Node branch1-: name: Node - branch2: name: Node branch2-: name: Node - 程序处理:
import yaml with open("yaml文件","r") as f:
message = yaml.load(f) print(type(message),message) 运行结果如下:
<class 'dict'> {'treeroot': {'branch1': {'name': 'Node 1', 'branch1-1': {'name': 'Node 1-1'}}, 'branch2': {'name': 'Node 2', 'branch2-1': {'name': 'Node 2-1'}}}}
yuml.dump方法:
这里还承接上面的脚本,调用里面的dataMap 数据,将其保存一直新的yaml 文件,如下:
import yaml
with open("yaml文件","r") as f:
message = yaml.load(f)
f1 = open("new_yaml.yaml","w")
yaml.dump(message,f1)
f1.close()
new_yaml.yaml的结果如下:
treeroot:
branch1:
branch1-1: {name: Node 1-1}
name: Node 1
branch2:
branch2-1: {name: Node 2-1}
name: Node 2
三、yaml 在python语言中的应用
yaml 语言在很多优秀的python 程序中都有使用,比如运维工程师经常使用的两个自动化工作saltstack 与 Ansible 。更多PyYAML 模块的用法,也可以查看其官方wiki页
YAML的适用范围
由于实现简单,解析成本很低,YAML特别适合在脚本语言中使用.列一下现有的语言现现:Ruby,Java,Perl,Python,PHP,OCaml,JavaScript。除了Java,其他都是脚本语言.YAML比较适合做序列化。因为它是宿主语言数据类型直转的。
YAML做配置文件也不错。比如Ruby on Rails的配置就选用的YAML。对ROR而言,这很自然,也很省事.由于兼容性问题,不同语言间的数据流转建议现在不要用YAML.
YAML文件及处理:
yaml文件:
name: Tom Smith
age:
spouse:
name: Jane Smith
age:
children:
- name: Jimmy Smith
age:
- name1: Jenny Smith
age1:
- work: dataanalysis
date: -- #yaml处理脚本
import yaml f = open("new_yaml.yaml","r")
message = yaml.load(f)
f.close()
print(message) 运行结果如下:
{'name': 'Tom Smith', 'spouse': {'name': 'Jane Smith', 'age': }, 'age': , 'children': [{'name': 'Jimmy Smith', 'age': }, {'age1': , 'name1': 'Jenny Smith'}, {'date': '2017-5-18', 'work': 'dataanalysis'}]}
从上面可以看出,"-"代表统计,生成的时候会是一个列表的形式,这样可用于字典下面嵌套列表,文件前面有几个"-"代表嵌套了几层字典。
day5模块学习--yaml文件处理的更多相关文章
- Python模块学习filecmp文件比较
Python模块学习filecmp文件比较 filecmp模块用于比较文件及文件夹的内容,它是一个轻量级的工具,使用非常简单.python标准库还提供了difflib模块用于比较文件的内容.关于dif ...
- day5模块学习 -- time、datetime时间模块
1.定义 模块:用来从逻辑上组织python(变量,函数,类,逻辑:实现一个功能)代码,本质就是.py结尾的python文件(文件名:test.py,对应的模块名test) 包:用来从逻辑上组织模块的 ...
- day5模块学习--configparser模块
使用ConfigParser模块读写ini文件(http://blog.csdn.net/linda1000/article/details/11729561) ConfigParserPyth ...
- day5模块学习--shutil模块
shutil模块 高级的 文件.文件夹.压缩包 处理模块 os模块提供了对目录或者文件的新建/删除/查看文件属性,还提供了对文件以及目录的路径操作.比如说:绝对路径,父目录…… 但是,os文件的操作 ...
- day5模块学习 -- os模块学习
python基础之模块之os模块 os模块 os模块的作用: os,语义为操作系统,所以肯定就是操作系统相关的功能了,可以处理文件和目录这些我们日常手动需要做的操作,就比如说:显示当前目录下所有文件/ ...
- day5模块学习--hashlib模块
hashlib模块 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度 ...
- day5模块学习--XML模块
XML文件处理 XML文件处理,有好几种方式,这里介绍一下xml.etree.ElementTree as ET. 注意:xml.etree.ElementTree模块在应对恶意结构数据时显得并不安全 ...
- day5模块学习--shelve模块
shelve模块 shelve类似于一个key-value数据库,可以很方便的用来保存Python的内存对象,其内部使用pickle来序列化数据,简单来说,使用者可以将一个列表.字典.或者用户自定义的 ...
- day5模块学习--sys模块
sys模块 sys模块是处理与系统相关的模块,sys(system),下面来看看sys模块常用的方法: 1.sys.argv #命令行参数list,第一个元素是程序本身路径 2.sys ...
随机推荐
- JAVA 线程池基本总结
合理利用线程池能够带来三个好处. 第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 第二:提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立即执行. 第三:提高线程 ...
- 新建 Vue项目 使用iView报错解决
错误如下: error in ./src/index.less Module build failed: // https://github.com/ant-design/ant-motion/iss ...
- bzoj千题计划142:bzoj3144: [Hnoi2013]切糕
http://www.lydsy.com/JudgeOnline/problem.php?id=3144 如果D=2 ,两个点,高度为4,建图如下 #include<queue> #inc ...
- HDU 3032 multi-sg 打表找规律
普通NIM规则加上一条可以分解为两堆,标准的Multi-SG游戏 一般Multi-SG就是根据拓扑图计算SG函数,这题打表后还能发现规律 sg(1)=1 sg(2)=2 sg(3)=mex{0,1,2 ...
- ZeroMQ API(二) 上下文
1.创建上下文 1.1 zmq_ctx_new(3) 1.1.1 名称 zmq_ctx_new - 创建新的ZMQ上下文 1.1.2 概要 void * zmq_ctx_new(); 1.1.3 描述 ...
- Jenkins git 的配置及问题解决
背景:最近项目需要 Jenkins 集成git,着手记录遇到的问题及解决方式 一.搭建Jenkins环境步骤这里(略) 二.安装Jenkins插件(系统管理-->插件管理-->可选插件)选 ...
- matlab中uigetfile命令的应用
matlab中uigetfile命令的应用 uigetfile命令的应用 此函数的用法为 [FileName,PathName,FilterIndex] = uigetfile(FilterSpec, ...
- Java并发编程原理与实战三十八:多线程调度器(ScheduledThreadPoolExecutor)
在前面介绍了java的多线程的基本原理信息:线程池的原理与使用 本文对这个java本身的线程池的调度器做一个简单扩展,如果还没读过上一篇文章,建议读一下,因为这是调度器的核心组件部分. 我们如果要用j ...
- [转载]教你如何塑造JavaScript牛逼形象
http://www.html5cn.org/article-6571-1.html 如何写JavaScript才能逼格更高呢?怎样才能组织JavaScript才能让别人一眼看出你不简单呢?是否很期待 ...
- CSS实现DIV层背景透明而文字不透明
在我们设计制作一些网页的时候可能会用到半透明的效果,首先我们可能会想到用PNG图片处理,当然这是一个不错的办法,唯一的兼容性问题就是ie6 下的BUG,但这也不困难,加上一段js处理就行了.但假如我们 ...