简单介绍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里将list中元素依次向前移动一位
Sep 12 Python
python获取本机mac地址和ip地址的方法
Apr 29 Python
Nginx搭建HTTPS服务器和强制使用HTTPS访问的方法
Aug 16 Python
利用python生成一个导出数据库的bat脚本文件的方法
Dec 30 Python
pandas数据框,统计某列数据对应的个数方法
Apr 11 Python
python中通过selenium简单操作及元素定位知识点总结
Sep 10 Python
python计算波峰波谷值的方法(极值点)
Feb 18 Python
python GUI库图形界面开发之PyQt5多行文本框控件QTextEdit详细使用方法实例
Feb 28 Python
pandas处理csv文件的方法步骤
Oct 16 Python
python如何利用cv2模块读取显示保存图片
Jun 04 Python
基于Python实现股票收益率分析
Apr 02 Python
使用python绘制横竖条形图
Apr 21 Python
教你如何使用Python实现二叉树结构及三种遍历
Python实现智慧校园自动评教全新版
python用海龟绘图写贪吃蛇游戏
Python使用海龟绘图实现贪吃蛇游戏
Jun 18 #Python
Python turtle实现贪吃蛇游戏
python中%格式表达式实例用法
Jun 18 #Python
如何用python清洗文件中的数据
Jun 18 #Python
You might like
杏林同学录(五)
2006/10/09 PHP
PHP字符转义相关函数小结(php下的转义字符串)
2007/04/12 PHP
浅谈web上存漏洞及原理分析、防范方法(安全文件上存方法)
2013/06/29 PHP
php通过修改header强制图片下载的方法
2015/03/24 PHP
ThinkPHP5.1框架数据库链接和增删改查操作示例
2019/08/03 PHP
JavaScript的9个陷阱及评点分析
2008/05/16 Javascript
Notify - 基于jquery的消息通知插件
2011/10/18 Javascript
jQuery源码分析-05异步队列 Deferred 使用介绍
2011/11/14 Javascript
IE的有条件注释判定IE版本详解(附实例代码)
2012/01/04 Javascript
50款非常棒的 jQuery 插件分享
2012/03/29 Javascript
web性能优化之javascript性能调优
2012/12/28 Javascript
分享33个jQuery与CSS3实现的绚丽鼠标悬停效果
2014/12/15 Javascript
JS实现星星评分功能实例代码(两种方法)
2016/06/09 Javascript
浅谈bootstrap使用中的一些问题以及解决过程
2016/10/18 Javascript
JS中检测数据类型的几种方式及优缺点小结
2016/12/12 Javascript
react开发教程之React 组件之间的通信方式
2017/08/12 Javascript
node.js实现的装饰者模式示例
2017/09/06 Javascript
详解js跨域请求的两种方式,支持post请求
2018/05/05 Javascript
nodeJs的安装与npm全局环境变量的配置详解
2020/01/06 NodeJs
[03:01]2014DOTA2国际邀请赛 DC:我是核弹粉,为Burning和国土祝福
2014/07/13 DOTA
[01:50]《我与DAC》之玩家:iG夺冠时的那面红旗
2018/03/29 DOTA
python 随机数生成的代码的详细分析
2011/05/15 Python
python抓取网页时字符集转换问题处理方案分享
2014/06/19 Python
Python中变量交换的例子
2014/08/25 Python
Python 实现随机数详解及实例代码
2017/04/15 Python
Python生成短uuid的方法实例详解
2018/05/29 Python
对Django外键关系的描述
2019/07/26 Python
Python空间数据处理之GDAL读写遥感图像
2019/08/01 Python
python 用Matplotlib作图中有多个Y轴
2020/11/28 Python
html5中的input新属性range使用记录
2014/09/05 HTML / CSS
高级文秘工作总结的自我评价
2013/09/28 职场文书
学生会感恩节活动方案
2014/10/11 职场文书
会议通知
2015/04/15 职场文书
2015年基层党建工作汇报材料
2015/06/25 职场文书
python利用while求100内的整数和方式
2021/11/07 Python
Go语言 详解net的tcp服务
2022/04/14 Golang