简单介绍Python的第三方库yaml


Posted in Python onJune 18, 2021
目录
  • 一、yaml基本介绍
  • 二、适用场景
  • 三、基本的语法规则
  • 四、YAML支持的三种数据结构
    • 4.1 对象
    • 4.2 数组
      • 4.2.1 对象和数组
    • 4.3 纯量
    • 4.4 还有一些特殊符号
      • 4.4.1 — YAML可在同一个文件中,使用—表示一个文档的开始
      • 4.4.2 …和—配合使用,在一个配置文件中代表一个的结束
      • 4.4.3 YAML中使用!!做类型强行转换
      • 4.4.4 > 在字符串中表示折叠换行;| 保留换行。这两个符号是YAML中字符串经常使用的符号
      • 4.4.5 引用。重复的内容在YAML中可使用&来完成锚点定义,用*来完成锚点引用
      • 4.4.6 合并内容。主要是和锚点配合使用,可将一个锚点内容直接合并到一个对象中
  • 五、实战
    • 5.1 安装yaml
    • 5.2 Python使用yaml

 

一、yaml基本介绍

yaml是Python的第三方库。YAML is a human friendly data serialization standard for all programming languages(YAML是一个对所有编程语言都很友好的数据序列化标准)。
但为了强调该语言以数据为中心,而不是以标记语言为重点,而用返璞词重新命名。它是一种直观的能够被电脑识别的数据序列化格式,是一种可读性高且容易被人类阅读、容易和脚本语言(不仅仅是Python)交互,用于表达资料序列的编程语言。YAML语言的本质是 一种通用的数据串行化格式。

 

二、适用场景

  • 在脚步语言中使用,实现简单,解析成本低;
  • 序列化;
  • 编程时写配置文件,比xml快,比ini文档功能更强。
  • YAML是专门用于写配置文件的语言,非常简洁和强大,远比JSON格式方便。

 

三、基本的语法规则

  • 大小写敏感;
  • 使用缩进表示层级关系;
  • 缩进时不允许使用Tab键,只允许使用空格;
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可(一般2个或4个空格);
  • #表示注释当前行。

 

四、YAML支持的三种数据结构

  • 对象:即键值对的集合,又称为映射(mapping)/哈希(hashes)/字典(dictionary);
  • 数组:一组按次序排列的值,又称为序列(sequence)/列表(list);
  • 纯量:单个的、不可再分的值。

 

4.1 对象

使用冒号代表,格式为 key: value。冒号后须加一个空格。
使用缩进表示层级关系,如下:

key:
  child_key1: value1
  child-key2: value2

YAML还支持流式(flow)语法表示对象,上例可写成:

key: {child_key1: value1, child_key2: value2}

这在Python中是 字典嵌套字典,是这么写的:

"key": {
        "child_key1":"value1",
        "child_key2":"value2"
       }

较为复杂的对象格式,可使用 一个问号 加一个空格代表一个复杂的key,配合一个冒号加一个空格 代表一个value:

? 
  - complex_key1
  - complex_key2
: 
  - complex_value1
  - complex_value2

上述表示:对象的属性是一个数组[complex_key1, complex_key2],其对应的值也是一个数组[complex_value1, complex_value2]。

 

4.2 数组

使用一个短横线 加一个空格代表一个数组项:

hobby:
  - python
  - test

也可以这样说:

-
  - python
  - test

可简单理解为:[[python, test]]
再看一个相对复杂的例子:

role:
- 
  id: 1
  name: developer
  auth: dev
- 
  id: 2
  name: tester
  auth: test

可理解为:role属性是一个数组,每个数组元素又是由id、name、auth 3个属性构成。
用流式(flow)的方式表示如下:

role: [{id: 1, name: developer, auth: dev}, {id: 2, name: tester, auth: test}]

 

4.2.1 对象和数组

可结合使用,形成复合结构

languages:
 - Ruby
 - Perl
 - Python 
websites:
 YAML: yaml.org 
 Ruby: ruby-lang.org 
 Python: python.org 
 Perl: use.perl.org

 

4.3 纯量

纯量是最基本的、不可再分的值。YAML提供了多种常量结构:整数、浮点数、字符串、NULL、日期、布尔值、时间。

int: 
- 123
- 0b1010_0111_0100_1010_1110 # 二进制表示
float:
- 3.14159
- 6.6e+5 # 可使用科学计数法
string:
- 'Hello world!' # 可使用双引号或单引号包裹特殊字符,双引号不会对特殊字符转义。
- newline
  newline2 # 字符串可拆成多行,每一行会被转化成一个空格
null: 
 nodeName: 'node'
 parent: ~ # 使用 ~ 表示null
boolean: 
 - TRUE # true 或True都可以
 - FALSE # false 或False都可以
date:
- 2018-12-29 # 日期必须使用ISO 8601格式,即yyyy-MM-dd
datetime: 
- 2018-12-29T18:43:21+08:00 #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区

 

4.4 还有一些特殊符号

 

4.4.1 — YAML可在同一个文件中,使用—表示一个文档的开始

server: 
  address: 192.168.1.100
---
spring: 
  profiles: development
  server: 
    address: 127.0.0.1
---
spring:
  profiles: production
  server: 
    address: 192.168.1.120

上述例子定义两个profile,一个development、一个production。

也可以用 —来分割不同的内容,比如记录日志:

---
Time: 2018-12-29T19:09:30+08:00
User: ed
Warning:
  This is an error message for the log file.
---
Time: 2018-12-29T19:11:45+08:00
User: ed
Warning:
  A slightly different error message.

 

4.4.2 …和—配合使用,在一个配置文件中代表一个的结束

---
time: 19:13:09
player: Tim
action: strike
...
---
time: 20:14:45
player: Lily
action: grand
...

此例相当于在一个yaml文件中连续写了两个yaml配置项。

 

4.4.3 YAML中使用!!做类型强行转换

string:
  - !!str 123456
  - !!str true

相当于将数字和布尔类型强转为字符串(允许转换的类型还有很多)。

 

4.4.4 > 在字符串中表示折叠换行;| 保留换行。这两个符号是YAML中字符串经常使用的符号

acomplistment: >
  Mark set a major league
  home run record in 1998.
status: |
  65 Home Runs
  0.278 Batting Average

accomplistment的结果为:

accomplistment=Mark set a major league home run record in 1998.

status的结果为:

status=65 Home Runs
 0.278 Batting Average

 

4.4.5 引用。重复的内容在YAML中可使用&来完成锚点定义,用*来完成锚点引用

hr: 
  - Mark McGwire
  - &SS Sammy Sosa
rbi: 
  - *SS
  - Ken Griffey

在hr中,使用&SS为Sammy Sosa设置了一个锚点(引用),名称为SS;在rbi中,使用*SS完成了锚点使用。结果是:

{rbi=[Mark McGwire, Ken Griffey], hr=[Mark McGwire, Sammy Sosa]}

也可以这样定义:

SS: &SS Sammy Sosa
hr:
 - Mark McGwire
 - *SS
rbi:
 - *SS 
 - Ken Griffey

还可以用锚点定义更复杂的内容:

default: &default
    - Mark McGwire
    - Sammy Sosa
hr: *default

hr相当于引用default数组。不过,hr: *default须写在同一行。

 

4.4.6 合并内容。主要是和锚点配合使用,可将一个锚点内容直接合并到一个对象中

merge:
  - &CENTER { x: 1, y: 2 }
  - &LEFT { x: 0, y: 2 }
  - &BIG { r: 10 }
  - &SMALL { r: 1 }
  
sample1: 
    <<: *CENTER
    r: 10
    
sample2:
    << : [ *CENTER, *BIG ]
    other: haha
    
sample3:
    << : [ *CENTER, *BIG ]
    r: 100

在merge中,定义了四个锚点,分别在sample中使用。

sample1中,<<: *CENTER意思是引用{x: 1,y: 2},并且合并到sample1中,那么合并的结果为:sample1={r=10, y=2, x=1}

sample2中,<<: [*CENTER, *BIG] 意思是联合引用{x: 1,y: 2}和{r: 10},并且合并到sample2中,那么合并的结果为:sample2={other=haha, x=1, y=2, r=10}

sample3中,引入了*CENTER, *BIG,还使用了r: 100覆盖了引入的r: 10,所以sample3值为:sample3={r=100, y=2, x=1}

有了合并,我们就可以在配置中,把相同的基础配置抽取出来,在不同的子配置中合并引用即可。

 

五、实战

 

5.1 安装yaml

yaml包名是 pyyaml,但导入是yaml。

 

5.2 Python使用yaml

以 【用Python 读取yaml文件(后缀可为 .yml 或 .yaml)】为例:先用open方法读取文件数据,再通过load方法转成字典(load方法跟json的load是相似的)。

在同一个文件夹下,编写yaml文件,名为 cfg.yml,内容如下:

nb:
  user: admin
  psw: 123456

编写读取yaml文件的.py文件,名为 readyml.py,内容如下:

import yaml
import os

curPath = os.path.dirname(os.path.realpath(__file__)) # 获取当前脚本所在文件夹路径
ymlPath = os.path.join(curPath, "cfg.yml") # 获取yaml文件路径

# 用open方法打开直接读取
f = open(ymlPath, 'r')
cfg = f.read()
print(type(cfg)) # 读取的结果是 字符串
print(cfg)

d = yaml.load(cfg) # 用load方法转字典
print(d)
print(type(d))

a = {'name': 'Tom',
	'race': 'cat',
	'traits': ['Two_Hand', 'Two_Eye']
}
ret = yaml.dump(a)
print(ret)
print(type(ret))

其中,最重要的两个方法:

  • load(),解析yaml文档,返回一个Python对象;
  • load_all(),如果是string或文件包含几块yaml文档,可用该方法来解析全部的文档,生成一个迭代器;
  • dump(),将一个Python对象生成为一个yaml文档;
  • dump_all(),将多个段输出到一个yaml文档中。

到此这篇关于简单介绍Python的第三方库yaml的文章就介绍到这了,更多相关Python库yaml内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
基于Python的XSS测试工具XSStrike使用方法
Jul 29 Python
Python内置模块turtle绘图详解
Dec 09 Python
python自动发邮件库yagmail的示例代码
Feb 23 Python
Python装饰器用法实例分析
Jan 14 Python
flask实现验证码并验证功能
Dec 05 Python
使用tensorflow显示pb模型的所有网络结点方式
Jan 23 Python
Django使用list对单个或者多个字段求values值实例
Mar 31 Python
Python使用OpenPyXL处理Excel表格
Jul 02 Python
keras分类之二分类实例(Cat and dog)
Jul 09 Python
在Ubuntu中安装并配置Pycharm教程的实现方法
Jan 06 Python
Python爬虫爬取ts碎片视频+验证码登录功能
Feb 22 Python
教你用Python写一个植物大战僵尸小游戏
Apr 25 Python
教你如何使用Python实现二叉树结构及三种遍历
Python实现智慧校园自动评教全新版
python用海龟绘图写贪吃蛇游戏
Python使用海龟绘图实现贪吃蛇游戏
Jun 18 #Python
Python turtle实现贪吃蛇游戏
python中%格式表达式实例用法
Jun 18 #Python
如何用python清洗文件中的数据
Jun 18 #Python
You might like
session 的生命周期是多长
2006/10/09 PHP
PHP写的获取各搜索蜘蛛爬行记录代码
2012/08/21 PHP
在wamp集成环境下升级php版本(实现方法)
2013/07/01 PHP
php中filter函数验证、过滤用户输入的数据
2014/01/13 PHP
php使用google地图应用实例
2014/12/31 PHP
PHP会话处理的10个函数
2015/08/11 PHP
Zend Framework框架之Zend_Mail实现发送Email邮件验证功能及解决标题乱码的方法
2016/03/21 PHP
js静态方法与实例方法分析
2011/07/04 Javascript
JavaScript高级程序设计(第3版)学习笔记2 js基础语法
2012/10/11 Javascript
Javascript实现动态菜单添加的实例代码
2013/07/05 Javascript
无限树Jquery插件zTree的常用功能特性总结
2014/09/11 Javascript
MVVM模式中ViewModel和View、Model有什么区别?
2015/06/19 Javascript
JavaScript用select实现日期控件
2015/07/17 Javascript
异步加载JS、CSS代码(推荐)
2016/06/15 Javascript
原生JS实现Ajax跨域请求flask响应内容
2017/10/24 Javascript
在React 组件中使用Echarts的示例代码
2017/11/08 Javascript
node 标准输入流和输出流代码实例
2019/09/19 Javascript
[06:30]DOTA2英雄梦之声_第15期_死亡先知
2014/06/21 DOTA
python数据库操作常用功能使用详解(创建表/插入数据/获取数据)
2013/12/06 Python
Python Web框架Flask中使用新浪SAE云存储实例
2015/02/08 Python
Python实现破解12306图片验证码的方法分析
2017/12/29 Python
Python+pyftpdlib实现局域网文件互传
2020/08/24 Python
详解python变量与数据类型
2020/08/25 Python
解决PyCharm IDE环境下,执行unittest不生成测试报告的问题
2020/09/03 Python
pytorch简介
2020/11/11 Python
python爬虫中PhantomJS加载页面的实例方法
2020/11/12 Python
使用CSS3来绘制一个月食图案
2015/07/18 HTML / CSS
大学生的网络创业计划书
2013/12/26 职场文书
解除劳动合同协议书(样本)
2014/10/02 职场文书
领导干部查摆“四风”问题自我剖析材料思想汇报
2014/10/05 职场文书
单位法人授权委托书范本
2014/10/09 职场文书
借条如何写
2015/05/26 职场文书
写给同事的离职感言
2015/08/04 职场文书
上级领导检查欢迎词
2015/09/30 职场文书
关于应聘教师的自荐信
2016/01/28 职场文书
MySQL数据库事务的四大特性
2022/04/20 MySQL