简单介绍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中map和列表推导效率比较实例分析
Jun 17 Python
python正则实现计算器功能
Dec 14 Python
pandas 实现字典转换成DataFrame的方法
Jul 04 Python
Python不同目录间进行模块调用的实现方法
Jan 29 Python
pyside+pyqt实现鼠标右键菜单功能
Dec 08 Python
python实现对服务器脚本敏感信息的加密解密功能
Aug 13 Python
Django框架模板用法入门教程
Nov 04 Python
python实现小程序推送页面收录脚本
Apr 20 Python
解决python中0x80072ee2错误的方法
Jul 19 Python
Django如何继承AbstractUser扩展字段
Nov 27 Python
用sleep间隔进行python反爬虫的实例讲解
Nov 30 Python
python 装饰器重要在哪
Feb 14 Python
教你如何使用Python实现二叉树结构及三种遍历
Python实现智慧校园自动评教全新版
python用海龟绘图写贪吃蛇游戏
Python使用海龟绘图实现贪吃蛇游戏
Jun 18 #Python
Python turtle实现贪吃蛇游戏
python中%格式表达式实例用法
Jun 18 #Python
如何用python清洗文件中的数据
Jun 18 #Python
You might like
PHP UTF8编码内的繁简转换类
2009/07/20 PHP
php强制文件下载而非在浏览器打开的自定义函数分享
2014/05/08 PHP
Chrome Web App开发小结
2014/09/04 PHP
为指定元素增加样式的js代码
2009/12/09 Javascript
jquery easyui combobox模糊过滤(示例代码)
2013/11/30 Javascript
不使用jquery实现js打字效果示例分享
2014/01/19 Javascript
js校验表单后提交表单的三种方法总结
2014/02/28 Javascript
javascript:void(0)的问题使用探讨
2014/04/10 Javascript
两个多选select(multiple左右)添加、删除选项和取值实例
2014/05/12 Javascript
JavaScript模块随意拖动示例代码
2014/05/27 Javascript
js实现的下拉框二级联动效果
2016/04/30 Javascript
不间断循环滚动效果的实例代码(必看篇)
2016/10/08 Javascript
jquery获取点击控件的绝对位置简单实例
2016/10/13 Javascript
分享十三个最佳JavaScript数据网格库
2017/04/07 Javascript
Express之托管静态文件的方法
2018/06/01 Javascript
react的滑动图片验证码组件的示例代码
2019/02/27 Javascript
原生JS封装拖动验证滑块的实现代码示例
2020/06/01 Javascript
如何在postman测试用例中实现断言过程解析
2020/07/09 Javascript
Vue多选列表组件深入详解
2021/03/02 Vue.js
[00:32]2018DOTA2亚洲邀请赛出场——LGD
2018/04/04 DOTA
[59:30]VG vs LGD 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
python 中文字符串的处理实现代码
2009/10/25 Python
详解django中使用定时任务的方法
2018/09/27 Python
Python异常的检测和处理方法
2018/10/26 Python
Python Series从0开始索引的方法
2018/11/06 Python
Python使用sqlite3模块内置数据库
2020/05/07 Python
波兰补充商店:Muscle Power
2018/10/29 全球购物
美国价格实惠的在线眼镜网站:Zeelool
2020/12/25 全球购物
屈臣氏越南官网:Watsons越南
2021/01/14 全球购物
写自荐信要注意什么
2013/12/26 职场文书
总账会计岗位职责
2014/03/13 职场文书
村长贪污检举信
2014/04/04 职场文书
2014高中生入党思想汇报范文
2014/09/13 职场文书
群众路线学习笔记范文
2014/11/06 职场文书
Python 机器学习工具包SKlearn的安装与使用
2021/05/14 Python
Java多线程并发FutureTask使用详解
2022/06/28 Java/Android