详解Python yaml模块


Posted in Python onSeptember 23, 2020

一、yaml文件介绍

yaml是一个专门用来写配置文件的语言。

1. yaml文件规则

  • 区分大小写;
  • 使用缩进表示层级关系;
  • 使用空格键缩进,而非Tab键缩进
  • 缩进的空格数目不固定,只需要相同层级的元素左侧对齐;
  • 文件中的字符串不需要使用引号标注,但若字符串包含有特殊字符则需用引号标注;
  • 注释标识为#

2. yaml文件数据结构

  • 对象:键值对的集合(简称 "映射或字典")

键值对用冒号 “:” 结构表示,冒号与值之间需用空格分隔

  • 数组:一组按序排列的值(简称 "序列或列表")

数组前加有 “-” 符号,符号与值之间需用空格分隔

  • 纯量(scalars):单个的、不可再分的值(如:字符串、bool值、整数、浮点数、时间、日期、null等)

None值可用null可 ~ 表示

二、python中读取yaml配置文件

1. 前提条件

python中读取yaml文件前需要安装pyyaml和导入yaml模块:

  • 使用yaml需要安装的模块为pyyaml(pip3 install pyyaml);
  • 导入的模块为yaml(import yaml)

2. 读取yaml文件数据

python通过open方式读取文件数据,再通过load函数将数据转化为列表或字典;

import yaml
import os

def get_yaml_data(yaml_file):
  # 打开yaml文件
  print("***获取yaml文件数据***")
  file = open(yaml_file, 'r', encoding="utf-8")
  file_data = file.read()
  file.close()
  
  print(file_data)
  print("类型:", type(file_data))

  # 将字符串转化为字典或列表
  print("***转化yaml数据为字典或列表***")
  data = yaml.load(file_data)
  print(data)
  print("类型:", type(data))
  return data
current_path = os.path.abspath(".")
yaml_path = os.path.join(current_path, "config.yaml")
get_yaml_data(yaml_path)

"""
***获取yaml文件数据***
# yaml键值对:即python中字典
usr: my
psw: 123455
类型:<class 'str'>
***转化yaml数据为字典或列表***
{'usr': 'my', 'psw': 123455}
类型:<class 'dict'>
"""

3. yaml文件数据为键值对

(1)yaml文件中内容为键值对:

# yaml键值对:即python中字典
usr: my
psw: 123455
s: " abc\n"

python解析yaml文件后获取的数据:

{'usr': 'my', 'psw': 123455, 's': ' abc\n'}

(2)yaml文件中内容为“键值对'嵌套"键值对"

# yaml键值对嵌套:即python中字典嵌套字典
usr1:
 name: a
 psw: 123
usr2:
 name: b
 psw: 456

python解析yaml文件后获取的数据:

{'usr1': {'name': 'a', 'psw': 123}, 'usr2': {'name': 'b', 'psw': 456}}

(3)yaml文件中“键值对”中嵌套“数组”

python解析yaml文件后获取的数据:

# yaml键值对中嵌套数组
usr3:
 - a
 - b
 - c
usr4:
 - b

python解析yaml文件后获取的数据:

{'usr3': ['a', 'b', 'c'], 'usr4': ['b']}

4. yaml文件数据为数组

(1)yaml文件中内容为数组

# yaml数组
- a
- b
- 5

python解析yaml文件后获取的数据:

['a', 'b', 5]

(2)yaml文件“数组”中嵌套“键值对”

# yaml"数组"中嵌套"键值对"
- usr1: aaa
- psw1: 111
 usr2: bbb
 psw2: 222

python解析yaml文件后获取的数据:

[{'usr1': 'aaa'}, {'psw1': 111, 'usr2': 'bbb', 'psw2': 222}]

5. yaml文件中基本数据类型:

# 纯量
s_val: name       # 字符串:{'s_val': 'name'}
spec_s_val: "name\n"  # 特殊字符串:{'spec_s_val': 'name\n'
num_val: 31.14     # 数字:{'num_val': 31.14}
bol_val: true      # 布尔值:{'bol_val': True}
nul_val: null      # null值:{'nul_val': None}
nul_val1: ~       # null值:{'nul_val1': None}
time_val: 2018-03-01t11:33:22.55-06:00   # 时间值:{'time_val': datetime.datetime(2018, 3, 1, 17, 33, 22, 550000)}
date_val: 2019-01-10  # 日期值:{'date_val': datetime.date(2019, 1, 10)}

6. yaml文件中引用

yaml文件中内容

animal3: &animal3 fish
test: *animal3

python读取的数据

{'animal3': 'fish', 'test': 'fish'}

三、python中读取多个yaml文档

1. 多个文档在一个yaml文件,使用 --- 分隔方式来分段

如:yaml文件中数据

# 分段yaml文件中多个文档
---
animal1: dog
age: 2
---
animal2: cat
age: 3

2. python脚本读取一个yaml文件中多个文档方法

python获取yaml数据时需使用load_all函数来解析全部的文档,再从中读取对象中的数据

# yaml文件中含有多个文档时,分别获取文档中数据
def get_yaml_load_all(yaml_file):
  # 打开yaml文件
  file = open(yaml_file, 'r', encoding="utf-8")
  file_data = file.read()
  file.close()
  all_data = yaml.load_all(file_data)
  for data in all_data:
    print(data)
current_path = os.path.abspath(".")
yaml_path = os.path.join(current_path, "config.yaml")
get_yaml_load_all(yaml_path)
"""结果
{'animal1': 'dog', 'age': 2}
{'animal2': 'cat', 'age': 3}
"""

四、python对象生成yaml文档

1. 直接导入yaml(即import yaml)生成的yaml文档

通过yaml.dump()方法不会将列表或字典数据进行转化yaml标准模式,只会将数据生成到yaml文档中

# 将python对象生成yaml文档
import yaml
def generate_yaml_doc(yaml_file):
  py_object = {'school': 'zhang',
         '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: zhang
students: [a, b]
"""

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

(1)使用ruamel模块中yaml前提条件

  • 使用yaml需要安装的模块:ruamel.yaml(pip3 install ruamel.yaml);
  • 导入的模块:from ruamel import yaml

(2)ruamel模块生成yaml文档

def generate_yaml_doc_ruamel(yaml_file):
  from ruamel import yaml
  py_object = {'school': 'zhang',
         '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: zhang
students:
- a
- b
"""

(3)ruamel模块读取yaml文档

# 通过from ruamel import yaml读取yaml文件

def get_yaml_data_ruamel(yaml_file):
  from ruamel import yaml
  file = open(yaml_file, 'r', encoding='utf-8')
  data = yaml.load(file.read(), Loader=yaml.Loader)
  file.close()
  print(data)
current_path = os.path.abspath(".")
yaml_path = os.path.join(current_path, "dict_config.yaml")
get_yaml_data_ruamel(yaml_path)

以上就是详解Python yaml模块的详细内容,更多关于Python yaml模块的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python实现的重启关机程序实例
Aug 21 Python
python登录pop3邮件服务器接收邮件的方法
Apr 30 Python
Python中的条件判断语句与循环语句用法小结
Mar 21 Python
浅谈python import引入不同路径下的模块
Jul 11 Python
在IPython中执行Python程序文件的示例
Nov 01 Python
Python通过for循环理解迭代器和生成器实例详解
Feb 16 Python
Python实现堡垒机模式下远程命令执行操作示例
May 09 Python
Python如何获取Win7,Win10系统缩放大小
Jan 10 Python
Python基于字典实现switch case函数调用
Jul 22 Python
Python中openpyxl实现vlookup函数的实例
Oct 28 Python
python 爬取天气网卫星图片
Jun 07 Python
教你用python实现12306余票查询
Jun 30 Python
python 绘制场景热力图的示例
Sep 23 #Python
Anaconda使用IDLE的实现示例
Sep 23 #Python
python获取时间戳的实现示例(10位和13位)
Sep 23 #Python
python rsa-oaep加密的示例代码
Sep 23 #Python
python删除文件、清空目录的实现方法
Sep 23 #Python
详解Anaconda 的安装教程
Sep 23 #Python
如何使用pycharm连接Databricks的步骤详解
Sep 23 #Python
You might like
PHP聊天室技术
2006/10/09 PHP
PHPMyAdmin 快速配置方法
2009/05/11 PHP
PHP 异步执行方法,模拟多线程的应用分析
2013/06/03 PHP
从零开始学YII2框架(一)通过Composer安装Yii2框架
2014/08/20 PHP
php递归函数怎么用才有效
2018/02/24 PHP
PHP智能识别收货地址信息实例
2019/01/05 PHP
PHP数据源架构模式之表入口模式实例分析
2020/01/23 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
Javascript实现动态菜单添加的实例代码
2013/07/05 Javascript
javascript使用isNaN()函数判断变量是否为数字
2013/09/21 Javascript
获取select元素被选中的文本内容的js代码
2014/01/29 Javascript
实例讲解使用原生JavaScript处理AJAX请求的方法
2016/05/10 Javascript
深入浅析JavaScript函数前面的加号和叹号
2016/07/09 Javascript
jQuery制作圣诞主题页面 更像是爱情影集
2016/08/10 Javascript
微信小程序 switch组件详解及简单实例
2017/01/10 Javascript
js仿QQ邮箱收件人选择与搜索功能
2017/02/10 Javascript
Bootstrap输入框组件简单实现代码
2017/03/06 Javascript
解决mpvue + vuex 开发微信小程序vuex辅助函数mapState、mapGetters不可用问题
2018/08/03 Javascript
webpack4.0 入门实践教程
2018/10/08 Javascript
jQuery实现的中英文切换功能示例
2019/01/11 jQuery
Vue+element+cookie记住密码功能的简单实现方法
2020/09/20 Javascript
Openlayers绘制聚合标注
2020/09/28 Javascript
Django框架验证码用法实例分析
2019/05/10 Python
PyQt5 QTable插入图片并动态更新的实例
2019/06/18 Python
Python  Django 母版和继承解析
2019/08/09 Python
PyTorch 对应点相乘、矩阵相乘实例
2019/12/27 Python
Python 开发工具PyCharm安装教程图文详解(新手必看)
2020/02/28 Python
Python使用tkinter实现小时钟效果
2021/02/22 Python
马来西亚奢侈品牌购物商城:Valiram 247
2020/09/29 全球购物
本科生详细的自我评价
2013/09/19 职场文书
工商管理实习生自我鉴定范文
2013/12/18 职场文书
企业安全生产目标责任书
2014/07/23 职场文书
学生检讨书
2015/01/27 职场文书
2016年大学生暑假爱心支教活动策划书
2015/11/26 职场文书
关于nginx 实现jira反向代理的问题
2021/09/25 Servers
python的列表生成式,生成器和generator对象你了解吗
2022/03/16 Python