简单介绍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  连接字符串(join %)
Sep 06 Python
python标准算法实现数组全排列的方法
Mar 17 Python
Python Paramiko模块的安装与使用详解
Nov 18 Python
Python中你应该知道的一些内置函数
Mar 31 Python
Python表示矩阵的方法分析
May 26 Python
浅谈配置OpenCV3 + Python3的简易方法(macOS)
Apr 02 Python
对python读写文件去重、RE、set的使用详解
Dec 11 Python
python3中eval函数用法使用简介
Aug 02 Python
python 列表、字典和集合的添加和删除操作
Dec 16 Python
tensorflow实现读取模型中保存的值 tf.train.NewCheckpointReader
Feb 10 Python
python实现logistic分类算法代码
Feb 28 Python
python实现飞船大战
Apr 24 Python
教你如何使用Python实现二叉树结构及三种遍历
Python实现智慧校园自动评教全新版
python用海龟绘图写贪吃蛇游戏
Python使用海龟绘图实现贪吃蛇游戏
Jun 18 #Python
Python turtle实现贪吃蛇游戏
python中%格式表达式实例用法
Jun 18 #Python
如何用python清洗文件中的数据
Jun 18 #Python
You might like
php数组(array)输出的三种形式详解
2013/06/05 PHP
php+jQuery.uploadify实现文件上传教程
2014/12/26 PHP
PHP和Shell实现检查SAMBA与NFS Server是否存在
2015/01/07 PHP
php过滤htmlspecialchars() 函数实现把预定义的字符转换为 HTML 实体用法分析
2019/06/25 PHP
js电信网通双线自动选择技巧
2008/11/18 Javascript
javascript检测浏览器flash版本的实现代码
2011/12/06 Javascript
cookie 最近浏览记录(中文escape转码)具体实现
2013/06/08 Javascript
js与jQuery 获取父窗、子窗的iframe
2013/12/20 Javascript
jquery中获取元素里某一特定子元素的代码
2014/12/02 Javascript
nw.js实现类似微信的聊天软件
2015/03/16 Javascript
JavaScript中eval函数的问题
2016/01/31 Javascript
半个小时学json(json传递示例)
2016/12/25 Javascript
深入理解js中的加载事件
2017/02/08 Javascript
node中koa中间件机制详解
2017/08/22 Javascript
Vue 动态组件与 v-once 指令的实现
2019/02/12 Javascript
详解小程序之简单登录注册表单验证
2019/05/13 Javascript
VueJS 取得 URL 参数值的方法
2019/07/19 Javascript
layui 数据表格 点击分页按钮 监听事件的实例
2019/09/02 Javascript
javascript设计模式 ? 外观模式原理与用法实例分析
2020/04/15 Javascript
[02:32]DOTA2英雄基础教程 祸乱之源
2013/12/23 DOTA
对Python3中的print函数以及与python2的对比分析
2018/05/02 Python
Python绘制的二项分布概率图示例
2018/08/22 Python
Python 图像处理: 生成二维高斯分布蒙版的实例
2019/07/04 Python
python+requests接口自动化框架的实现
2020/08/31 Python
通过css3的filter滤镜改变png图片的颜色的示例代码
2020/05/06 HTML / CSS
HTML5自定义data-* data(obj)属性和jquery的data()方法的使用
2012/12/13 HTML / CSS
Shopbop中文官网:美国亚马逊旗下时尚购物网站
2020/12/15 全球购物
《太阳》教学反思
2014/02/21 职场文书
平安工地建设方案
2014/05/06 职场文书
环保建议书300字
2014/05/14 职场文书
班子查摆四风个人对照检查材料思想汇报
2014/10/04 职场文书
幼儿园教师管理制度
2015/08/05 职场文书
2015年度个人工作总结报告
2015/10/24 职场文书
班主任班级管理心得体会
2016/01/07 职场文书
公司会议开幕词
2016/03/03 职场文书
win10怎么设置右下角图标不折叠?Win10设置右下角图标不折叠的方法
2022/07/15 数码科技