简单介绍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 相关文章推荐
go和python调用其它程序并得到程序输出
Feb 10 Python
用Python编写一个简单的俄罗斯方块游戏的教程
Apr 03 Python
Linux系统上Nginx+Python的web.py与Django框架环境
Dec 25 Python
Python创建字典的八种方式
Feb 27 Python
python hough变换检测直线的实现方法
Jul 12 Python
Python测试线程应用程序过程解析
Dec 31 Python
python使用pandas抽样训练数据中某个类别实例
Feb 28 Python
Python logging模块写入中文出现乱码
May 21 Python
python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图
Aug 04 Python
python 监控服务器是否有人远程登录(详细思路+代码)
Dec 18 Python
python 装饰器的基本使用
Jan 13 Python
如何用python爬取微博热搜数据并保存
Feb 20 Python
教你如何使用Python实现二叉树结构及三种遍历
Python实现智慧校园自动评教全新版
python用海龟绘图写贪吃蛇游戏
Python使用海龟绘图实现贪吃蛇游戏
Jun 18 #Python
Python turtle实现贪吃蛇游戏
python中%格式表达式实例用法
Jun 18 #Python
如何用python清洗文件中的数据
Jun 18 #Python
You might like
用缓存实现静态页面的测试
2006/12/06 PHP
PHP 中英文混合排版中处理字符串常用的函数
2007/04/12 PHP
yii操作cookie实例简介
2014/07/09 PHP
Laravel框架数据库CURD操作、连贯操作总结
2014/09/03 PHP
PHP实现通过二维数组键值获取一维键名操作示例
2019/10/11 PHP
FireFox与IE 下js兼容触发click事件的代码
2008/11/20 Javascript
通过jquery的$.getJSON做一个跨域ajax请求试验
2011/05/03 Javascript
Javascript获取窗口(容器)的大小及位置参数列举及简要说明
2012/12/09 Javascript
js将控件隐藏的方法及display属性介绍
2013/07/04 Javascript
基于jQuery的图片不完全按比例自动缩小
2014/07/11 Javascript
5个JavaScript经典面试题
2014/10/13 Javascript
20条学习javascript的编程规范的建议
2014/11/28 Javascript
js实现select跳转菜单新窗口效果代码分享(超简单)
2015/08/21 Javascript
浅析2种JavaScript继承方式
2015/12/04 Javascript
js右下角弹出提示框示例代码
2016/01/12 Javascript
用node和express连接mysql实现登录注册的实现代码
2017/07/05 Javascript
parabola.js抛物线与加入购物车效果的示例代码
2017/10/25 Javascript
浅谈vue-router 路由传参的方法
2017/12/27 Javascript
vue scroller返回页面记住滚动位置的实例代码
2018/01/29 Javascript
vue中uni-app 实现小程序登录注册功能
2019/10/12 Javascript
jQuery实现数字华容道小游戏(实例代码)
2020/01/16 jQuery
浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用
2020/03/08 Javascript
跟老齐学Python之Python文档
2014/10/10 Python
pytorch 可视化feature map的示例代码
2019/08/20 Python
python map比for循环快在哪
2020/09/21 Python
python re.match()用法相关示例
2021/01/27 Python
css3弹性盒模型(Flexbox)详细介绍
2014/10/08 HTML / CSS
SQL SERVER面试资料
2013/03/30 面试题
医药专业推荐信
2013/11/15 职场文书
高中物理教学反思
2014/02/08 职场文书
永远跟党走演讲稿
2014/09/12 职场文书
聘任证明怎么写
2015/03/02 职场文书
个人思想政治总结
2015/03/05 职场文书
幼儿园六一主持词开场白
2015/05/28 职场文书
2015年医院保卫科工作总结
2015/07/23 职场文书
matplotlib之pyplot模块实现添加子图subplot的使用
2021/04/25 Python