详解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 相关文章推荐
python实现划词翻译
Apr 23 Python
Python对列表中的各项进行关联详解
Aug 15 Python
Python编程求解二叉树中和为某一值的路径代码示例
Jan 04 Python
python3将视频流保存为本地视频文件
Jun 20 Python
flask框架实现连接sqlite3数据库的方法分析
Jul 16 Python
详解Django中类视图使用装饰器的方式
Aug 12 Python
python按时间排序目录下的文件实现方法
Oct 17 Python
Pandas库之DataFrame使用的学习笔记
Jun 21 Python
Python操作excel的方法总结(xlrd、xlwt、openpyxl)
Sep 02 Python
Laravel框架表单验证格式化输出的方法
Sep 25 Python
Python实战之实现简易的学生选课系统
May 25 Python
python区块链持久化和命令行接口实现简版
May 25 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
在PHP里得到前天和昨天的日期的代码
2007/08/16 PHP
php中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串
2011/08/23 PHP
PHP编程中的__clone()方法使用详解
2015/11/27 PHP
JavaScript 权威指南(第四版) 读书笔记
2009/08/11 Javascript
js关闭模态窗口刷新父页面或跳转页面
2012/12/13 Javascript
jquery 插件开发 extjs中的extend用法小结
2013/01/04 Javascript
jquery 提示信息显示后自动消失的具体实现
2013/12/18 Javascript
JQuery 在线引用及测试引用是否成功
2014/06/24 Javascript
js使用DOM操作实现简单留言板的方法
2015/04/10 Javascript
对JavaScript的全文搜索实现相关度评分的功能的方法
2015/06/24 Javascript
JS判断两个对象内容是否相等的方法示例
2017/04/10 Javascript
微信小程序实现瀑布流布局与无限加载的方法详解
2017/05/12 Javascript
js 原生判断内容区域是否滚动到底部的实例代码
2017/11/15 Javascript
Echarts动态加载多条折线图的实现代码
2019/05/24 Javascript
分析在Python中何种情况下需要使用断言
2015/04/01 Python
给Python初学者的一些编程技巧
2015/04/03 Python
python如何读写csv数据
2018/03/21 Python
Python一句代码实现找出所有水仙花数的方法
2018/11/13 Python
python绘制简单彩虹图
2018/11/19 Python
Python 获取中文字拼音首个字母的方法
2018/11/28 Python
使用Python给头像戴上圣诞帽的图像操作过程解析
2019/09/20 Python
python字典排序的方法
2019/10/12 Python
Python namedtuple命名元组实现过程解析
2020/01/08 Python
简单了解django处理跨域请求最佳解决方案
2020/03/25 Python
python with语句的原理与用法详解
2020/03/30 Python
用 Django 开发一个 Python Web API的方法步骤
2020/12/03 Python
CSS3中引入多种自定义字体font-face
2020/06/12 HTML / CSS
远程Wi-Fi宠物监控相机:Petcube
2017/04/26 全球购物
英国计算机产品零售商:Novatech(定制个人电脑、笔记本电脑、工作站和服务器)
2018/01/28 全球购物
水上运动奥特莱斯:Wasterports Outlet
2018/08/08 全球购物
工商管理专业学生的自我评价
2013/10/01 职场文书
行政总经理岗位职责
2013/12/05 职场文书
电脑租赁公司创业计划书
2014/01/08 职场文书
《水乡歌》教学反思
2014/04/24 职场文书
靠谱的活动总结
2019/04/16 职场文书
分布式锁为什么要选择Zookeeper而不是Redis?看完这篇你就明白了
2021/05/21 Redis