详解Python中Pyyaml模块的使用


Posted in Python onOctober 08, 2020

一、YAML是什么

YAML是专门用来写配置文件的语言,远比JSON格式方便。

YAML语言的设计目标,就是方便人类读写。

YAML是一种比XML和JSON更轻的文件格式,也更简单更强大,它可以通过缩进来表示结构,是不是听起来就和Python很搭?

顾名思义,用语言编写的文件就可以称之为YAML文件。PyYaml是Python的一个专门针对YAML文件操作的模块,使用起来非常简单

安装 pip install pyyaml  # 如果是py2,使用 pip install yaml

二、PyYaml的简单使用

使用起来非常简单,就像json、pickle一样,load、dump就足够我们使用了。

load()示例:返回一个对象

import yaml

yaml_str = """
name: 一条大河
age: 1956
job: Singer
"""

y = yaml.load(yaml_str, Loader=yaml.SafeLoader)
print(y)

运行结果:

{'name': '一条大河', 'age': 1956, 'job': 'Singer'}

load_all()示例:生成一个迭代器

如果string或文件包含几块yaml文档,可以使用yaml.load_all来解析全部的文档。

yaml_test.yaml文件内容:

---
name: qiyu
age: 20岁
---
name: qingqing
age: 19岁

操作yaml文件的test.py文件如下:

import yaml

with open("./yaml_test", 'r', encoding='utf-8') as ymlfile:
  cfg = yaml.load_all(ymlfile, Loader=yaml.SafeLoader)
  for data in cfg:
    print(data)

运行结果:

{'name': 'qiyu', 'age': '20岁'}
{'name': 'qingqing', 'age': '19岁'}

dump()示例:将一个python对象生成为yaml文档

import yaml

json_data = {'name': '一条大河',
       'age': 1956,
       'job': ['Singer','Dancer']}

y = yaml.dump(json_data, default_flow_style=False).encode('utf-8').decode('unicode_escape')
print(y)

运行结果:

age: 1956
job:
- Singer
- Dancer
name: "一条大河"

使用dump()传入参数,可以直接把内容写入到yaml文件:

import yaml

json_data = {'name': '一条大河',
       'age': 1956,
       'job': ['Singer', 'Dancer']}
with open('./yaml_write.yaml', 'w') as f:
  y = yaml.dump(json_data, f)
  print(y)

写入内容后的yaml_write.yaml:

详解Python中Pyyaml模块的使用

yaml.dump_all()示例:将多个段输出到一个文件中

import yaml

obj1 = {"name": "river", "age": 2019}
obj2 = ["Lily", 1956]
obj3 = {"gang": "ben", "age": 1963}
obj4 = ["Zhuqiyu", 1994]

with open('./yaml_write_all.yaml', 'w', encoding='utf-8') as f:
  y = yaml.dump([obj1, obj2, obj3, obj4], f)
  print(y)

with open('./yaml_write_all.yaml', 'r') as r:
  y1 = yaml.load(r, Loader=yaml.SafeLoader)
  print(y1)

写入内容后的yaml_write_all.yaml:

详解Python中Pyyaml模块的使用

为什么写入文件后的格式有的带1个“-”,有的带2个“-”?

为什么yaml文件读出来的的格式是List?

三、YAML的语法规则和数据结构

看完了以上4个简单的示例,现在就来总结下YAML语言的基本语法

YAML 基本语法规则如下:

1、大小写敏感

2、使用缩进表示层级关系

3、缩进时不允许使用Tab键,只允许使用空格。

4、缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

5、# 表示注释,从这个字符一直到行尾,都会被解析器忽略,这个和python的注释一样

6、列表里的项用"-"来代表,字典里的键值对用":"分隔

知道了语法规则,现在来回答下上面的2个问题:

1、带1个“-”表示不同的模块(单个数组或者字典),带2个“-”是因为数组中元素以“-”开始,加上表示不同模块的那一个“-”,呈现出来就是2个“-”

2、因为yaml文件中包含多个模块(多个数组或者字典),读取出来的是这些模块的一个集合

3、有且只有当yaml文件中只有1个字典时,读取出来的数据的类型也是字典

YAML 支持的数据结构有3种:

1、对象:键值对的集合

2、数组:一组按次序排列的值,序列(sequence) 或 列表(list)

3、纯量(scalars):单个的、不可再分的值,如:字符串、布尔值、整数、浮点数、Null、时间、日期

支持数据示例:

yaml_test_data.yaml的内容:

str: "Big River"              #字符串
int: 1548                 #整数
float: 3.14                #浮点数
boolean: true               #布尔值
None: null                # 也可以用 ~ 号来表示 null
time: '2019-11-20T08:47:46.576701+00:00'    # 时间,ISO8601 
date: 2019-11-20 16:47:46.576702        # 日期

操作代码:

import yaml
import datetime
import pytz

yaml_data = {
  "str": "Big River",
  "int": 1548,
  "float": 3.14,
  'boolean': True,
  "None": None,
  'time': datetime.datetime.now(tz=pytz.timezone('UTC')).isoformat(),
  'date': datetime.datetime.today()
}

with open('./yaml_test', 'w') as f:
  y = yaml.dump(yaml_data, f)
  print(y)

with open('./yaml_test', 'r') as r:
  y1 = yaml.load(r, Loader=yaml.SafeLoader)
  print(y1)

控制台输出:

详解Python中Pyyaml模块的使用

其他语法规则

1、如果字符串没有空格或特殊字符,不需要加引号,但如果其中有空格或特殊字符,就需要加引号了

详解Python中Pyyaml模块的使用

2、引用

& 和 * 用于引用

name: &name SKP
tester: *name

运行结果:

{'name': 'SKP', 'tester': 'SKP'}

3、强制转换

用 !! 实现

str: !!str 3.14
int: !!int "123"

运行结果:

{'int': 123, 'str': '3.14'}

4、分段

在同一个yaml文件中,可以用“—”3个“-”来分段,这样可以将多个文档写在一个文件中

举例见上述load_all()示例

四、python对象生成yaml文档

1、yaml.dump()方法

import yaml
import os

def generate_yaml_doc(yaml_file):
  py_object = {'school': 'zhu',
         'students': ['a', 'b']}
  file = open(yaml_file, 'w', encoding='utf-8')
  yaml.dump(py_object, file)
  file.close()

current_path = os.path.abspath(".")
yaml_path = os.path.join(current_path, "generate.yaml")
generate_yaml_doc(yaml_path)
"""结果
school: zhu
students:
- a
- b
"""

2、使用ruamel模块中的yaml方法生成标准的yaml文档

import os
from ruamel import yaml   # pip3 install ruamel.yaml

def generate_yaml_doc_ruamel(yaml_file):
  py_object = {'school': 'zhu',
         'students': ['a', 'b']}
  file = open(yaml_file, 'w', encoding='utf-8')
  yaml.dump(py_object, file, Dumper=yaml.RoundTripDumper)
  file.close()

current_path = os.path.abspath(".")
yaml_path = os.path.join(current_path, "generate.yaml")
generate_yaml_doc_ruamel(yaml_path)
"""结果
school: zhu
students:
- a
- b
"""

使用ruamel模块中的yaml方法读取yaml文档(用法与单独import yaml模块一致)

import os
from ruamel import yaml

def get_yaml_data_ruamel(yaml_file):
  file = open(yaml_file, 'r', encoding='utf-8')
  data = yaml.load(file, Loader=yaml.Loader)
  file.close()
  print(data)

current_path = os.path.abspath(".")
yaml_path = os.path.join(current_path, "generate.yaml")
get_yaml_data_ruamel(yaml_path)

到此这篇关于Python中Pyyaml模块的使用的文章就介绍到这了,更多相关Python中Pyyaml模块内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
ptyhon实现sitemap生成示例
Mar 30 Python
python生成圆形图片的方法
Mar 25 Python
分分钟入门python语言
Mar 20 Python
pytorch构建网络模型的4种方法
Apr 13 Python
解决python爬虫中有中文的url问题
May 11 Python
python 定时器,轮询定时器的实例
Feb 20 Python
Django基础三之视图函数的使用方法
Jul 18 Python
ipad上运行python的方法步骤
Oct 12 Python
对Tensorflow中Device实例的生成和管理详解
Feb 04 Python
基于TensorBoard中graph模块图结构分析
Feb 15 Python
使用Python三角函数公式计算三角形的夹角案例
Apr 15 Python
python读取yaml文件后修改写入本地实例
Apr 27 Python
Python实现七个基本算法的实例代码
Oct 08 #Python
python自动化测试三部曲之request+django实现接口测试
Oct 07 #Python
python自动化测试三部曲之unittest框架的实现
Oct 07 #Python
浅谈anaconda python 版本对应关系
Oct 07 #Python
简述python&pytorch 随机种子的实现
Oct 07 #Python
详解基于python的全局与局部序列比对的实现(DNA)
Oct 07 #Python
python单元测试框架pytest的使用示例
Oct 07 #Python
You might like
实现“上一页”和“下一页按钮
2006/10/09 PHP
php的字符串用法小结
2010/06/08 PHP
asp.net+js 实现无刷新上传解析csv文件的代码
2010/05/17 Javascript
JS实现关键字搜索时的相关下拉字段效果
2014/08/05 Javascript
js实现点击图片改变页面背景图的方法
2015/02/28 Javascript
整理Javascript流程控制语句学习笔记
2015/11/29 Javascript
JQuery实现网页右侧随动广告特效
2016/01/17 Javascript
使用PBFunc在Powerbuilder中支付宝当面付款功能
2016/10/01 Javascript
jquery对象和DOM对象的相互转换详解
2016/10/18 Javascript
axios基本入门用法教程
2017/03/25 Javascript
详解Vue中一种简易路由传参办法
2017/09/15 Javascript
vue-cli之router基本使用方法详解
2017/10/17 Javascript
深入理解Vue 单向数据流的原理
2017/11/09 Javascript
JS实现统计字符串中字符出现个数及最大个数功能示例
2018/06/04 Javascript
浅谈微信小程序之官方UI框架we-ui使用教程
2018/08/20 Javascript
vue+elementUi图片上传组件使用详解
2019/08/20 Javascript
jQuery实现tab栏切换效果
2020/12/22 jQuery
[07:49]2014DOTA2国际邀请赛 Newbee夺冠后采访xiao8坦言奖金会上交
2014/07/23 DOTA
[02:14]完美“圣”典2016风云人物:xiao8专访
2016/12/01 DOTA
Python中的作用域规则详解
2015/01/30 Python
Python常见格式化字符串方法小结【百分号与format方法】
2016/09/18 Python
Python3安装Scrapy的方法步骤
2017/11/23 Python
python3实现爬取淘宝美食代码分享
2018/09/23 Python
对python中xlsx,csv以及json文件的相互转化方法详解
2018/12/25 Python
django 单表操作实例详解
2019/07/30 Python
python统计指定目录内文件的代码行数
2019/09/19 Python
wxPython实现文本框基础组件
2019/11/18 Python
python实现简单贪吃蛇游戏
2020/09/29 Python
python中实现栈的三种方法
2020/12/19 Python
Bergfreunde丹麦:登山装备网上零售商
2017/02/26 全球购物
香港草莓网土耳其网站:Strawberrynet TR
2017/03/02 全球购物
一组SQL面试题
2016/02/15 面试题
幼儿园教师管理制度
2015/08/05 职场文书
vue中 this.$set的使用详解
2021/11/17 Vue.js
MySQL为数据表建立索引的原则详解
2022/03/03 MySQL
关于Nginx中虚拟主机的一些冷门知识小结
2022/03/03 Servers