详解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处理圆角图片、圆形图片的例子
Apr 25 Python
跟老齐学Python之复习if语句
Oct 02 Python
通过源码分析Python中的切片赋值
May 08 Python
python初学之用户登录的实现过程(实例讲解)
Dec 23 Python
浅谈Pycharm调用同级目录下的py脚本bug
Dec 03 Python
Pytorch之卷积层的使用详解
Dec 31 Python
浅谈pycharm导入pandas包遇到的问题及解决
Jun 01 Python
Python logging日志模块 配置文件方式
Jul 12 Python
详解如何修改python中字典的键和值
Sep 29 Python
python中doctest库实例用法
Dec 31 Python
python抢购软件/插件/脚本附完整源码
Mar 04 Python
Python闭包的定义和使用方法
Apr 11 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
全国FM电台频率大全 - 21 海南省
2020/03/11 无线电
PHP开发微信支付的代码分享
2014/05/25 PHP
php实现根据词频生成tag云的方法
2015/04/17 PHP
PHP 实现公历日期与农历日期的互转换
2017/09/13 PHP
关于恒等于(===)和非恒等于(!==)
2007/08/20 Javascript
JavaScript 直接操作本地文件的实现代码
2009/12/01 Javascript
javascript showModalDialog,open取得父窗口的方法
2010/03/10 Javascript
jQuery的12招常用技巧分享
2011/08/08 Javascript
js取得url地址参数实例
2013/02/22 Javascript
js数组循环遍历数组内所有元素的方法
2014/01/18 Javascript
js仿京东轮播效果 选项卡套选项卡使用
2017/01/12 Javascript
jquery实现左右轮播切换效果
2018/01/01 jQuery
Vue完整项目构建(进阶篇)
2018/02/10 Javascript
r.js来合并压缩css文件的示例
2018/04/26 Javascript
JS实现的排列组合算法示例
2019/07/16 Javascript
关于vue 结合原生js 解决echarts resize问题
2020/07/26 Javascript
python字符串替换示例
2014/04/24 Python
Python实现图片拼接的代码
2018/07/02 Python
Django添加feeds功能的示例
2018/08/07 Python
Python 之 Json序列化嵌套类方式
2020/02/27 Python
Corelle官方网站:购买康宁餐具
2016/11/02 全球购物
BOSE德国官网:尽探索之力,享音乐之极
2016/12/11 全球购物
澳大利亚UGG工厂直销:Australian Ugg Boots
2017/10/14 全球购物
航空学院求职信
2014/06/11 职场文书
单位介绍信格式
2015/01/31 职场文书
教师党员自我评价范文
2015/03/04 职场文书
2015年班组工作总结
2015/04/20 职场文书
《小摄影师》教学反思
2016/02/18 职场文书
2016年小学优秀班主任事迹材料
2016/02/29 职场文书
创业计划书之游泳馆
2019/09/16 职场文书
Redis数据结构之链表与字典的使用
2021/05/11 Redis
小程序与后端Java接口交互实现HelloWorld入门
2021/07/09 Java/Android
MySQL千万级数据表的优化实战记录
2021/08/04 MySQL
彻底解决MySQL使用中文乱码的方法
2022/01/22 MySQL
使用python创建股票的时间序列可视化分析
2022/03/03 Python
新的CSS 伪类函数 :is() 和 :where()示例详解
2022/08/05 HTML / CSS