一、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 yamlyaml_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 yamlwith 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 yamljson_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 yamljson_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:

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

import yamlobj1 = {"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:

为什么写入文件后的格式有的带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 pytzyaml_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)

控制台输出:

其他语法规则

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

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 osdef 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.yamldef 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 yamldef 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)

点赞关注~~持续分享。加入我们,642830685,群内免费领取最新软件测试大厂面试资料和Python自动化、接口、框架搭建学习资料!技术大牛解惑答疑,同行一起交流。

Python中Pyyaml模块的使用相关推荐

  1. Python的PyYAML模块详解

    文章目录 注:原文链接 简介 安装 简单安装 从源码安装 最常被问到的问题 使用详解 加载YAML 转储YAML 构造.表示和解析 YAML语法 文档 块序列 块映射 流集合 标量 别名 标签 YAM ...

  2. python sys模块作用_浅谈Python中的模块

    模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在Python中,一个.py文件就称之为一个模块(Mod ...

  3. python中Scipy模块求取积分

    python中Scipy模块求取积分的方法: SciPy下实现求函数的积分的函数的基本使用,积分,高等数学里有大量的讲述,基本意思就是求曲线下面积之和. 其中rn可认为是偏差,一般可以忽略不计,wi可 ...

  4. python中的time库安装步骤-python中time模块需要安装么

    time是python自带的模块,用于处理时间问题,提供了一系列的操作时间的函数. time模块中时间表现的格式主要有三种:(推荐学习:Python视频教程) timestamp时间戳,是以秒表示从& ...

  5. 关于python中requests模块导入问题-python中requests模块的使用方法

    本文实例讲述了python中requests模块的使用方法.分享给大家供大家参考.具体分析如下: 在HTTP相关处理中使用python是不必要的麻烦,这包括urllib2模块以巨大的复杂性代价获取综合 ...

  6. python哪里下载import包-详解python中的模块及包导入

    python中的导入关键字:import 以及from import 1.import import一般用于导入包以及模块. 不过有个小问题: (1)当导入的是模块的时候是可以直接可以使用模块内的函数 ...

  7. python中copy模块的使用,深拷贝和浅拷贝

    python中copy模块的使用,深拷贝和浅拷贝 文章目录: 一.copy模块的介绍 1.copy模块 二.copy模块的使用 拓展说明: 1.id( )函数的使用 2.is和== 的区别 pytho ...

  8. python中的模块和包

    模块 一 什么是模块 模块就是一组功能的集合体,可以通过导入模块来复用模块的功能. 比如我在同一个文件夹定义两个.py文件,分别命名为A.py和B.py,那么可以通过在A文件里通过import B来使 ...

  9. python中pyecharts模块全局配置_python中pyecharts模块的使用示例

    python中pyecharts模块的使用示例 发布时间:2020-11-24 09:28:53 来源:亿速云 阅读:66 作者:小新 小编给大家分享一下python中pyecharts模块的使用示例 ...

最新文章

  1. pandas groupby
  2. elixir官方入门教程 模式匹配
  3. 记一次与用户的亲密接触
  4. 一 Struts2 开发流程
  5. ITK:复制复合变换CompositeTransform
  6. PHP截取IE浏览器并缩小原图的方法
  7. [渝粤教育] 西南科技大学 电力电子技术 在线考试复习资料
  8. Laravel 获取执行的sql语句
  9. JavaScript实现图片上传并预览并提交
  10. Nginx配置HTTPS和HTTP
  11. Introduction to Computer Networking学习笔记(十九):rate guarantees交换速度保证
  12. cpu vtx测试软件,推荐几个好用的检测电脑CPU是否支持(Virtualization Technology)虚拟化技术的工具-推荐实用小软件 -亦是美网络...
  13. ldd -r xxx.so命令 undefined symbol即错误定位c++filt
  14. 火狐浏览器找不到书签了
  15. layui导入模板数据_使用layui模板填充页面数据
  16. 顺丰快递单号查询API开发指南-快递鸟
  17. 最新四川大学软件工程课程期末官方复习知识点提纲
  18. 百度地图车辆运动轨迹
  19. SAP 采购定价日期控制
  20. 编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary

热门文章

  1. wrappers.php,PHP源码阅读笔记六:stream_get_wrappers函数
  2. 限时7天的附下载链CobaltStrike
  3. CTF之MISC题目-西游记
  4. 什么是应用服务器,常用的应用服务器有哪些
  5. 禅道安装及团队成员登录
  6. ssj框架的搭建流程
  7. MacBook Pro如何安装Python编译器
  8. C++11 timed_mutex
  9. 开源软件开发导论第一次作业——针对开源的五个问题
  10. html js涨幅率怎么计算,JS加速线指标的计算公式及买卖分析