详解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 相关文章推荐
python3实现ftp服务功能(客户端)
Mar 24 Python
python进阶_浅谈面向对象进阶
Aug 17 Python
Python实现文件内容批量追加的方法示例
Aug 29 Python
django数据库migrate失败的解决方法解析
Feb 08 Python
Python pyinotify日志监控系统处理日志的方法
Mar 08 Python
Python帮你微信头像任意添加装饰别再@微信官方了
Sep 25 Python
Python 中如何实现参数化测试的方法示例
Dec 10 Python
PyTorch加载预训练模型实例(pretrained)
Jan 17 Python
Python3使用腾讯云文字识别(腾讯OCR)提取图片中的文字内容实例详解
Feb 18 Python
Python自动化之UnitTest框架实战记录
Sep 08 Python
使paramiko库执行命令时在给定的时间强制退出功能的实现
Mar 03 Python
python如何进行基准测试
Apr 26 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中mb_convert_encoding与iconv函数的深入解析
2013/06/21 PHP
php中将一段数据存到一个txt文件中并显示其内容
2014/08/15 PHP
php5.4以下版本json不支持不转义内容中文的解决方法
2015/01/13 PHP
PHP curl模拟登录带验证码的网站
2015/11/30 PHP
PHP实现Session入库/存入redis的方法
2017/05/04 PHP
php对象工厂类完整示例
2018/08/09 PHP
获取dom元素那些讨厌的位置封装代码
2010/06/23 Javascript
js Form.elements[i]的使用实例
2011/11/13 Javascript
JQuery给元素绑定click事件多次执行的解决方法
2014/05/29 Javascript
JavaScript日期时间与时间戳的转换函数分享
2015/01/31 Javascript
用JavaScript判断CSS浏览器类型前缀的两种方法
2015/10/08 Javascript
javascript字符串替换函数如何一次性全部替换掉
2015/10/30 Javascript
javascript嵌套函数和在函数内调用外部函数的区别分析
2016/01/31 Javascript
ECMAScript6轮播图实践知识总结
2016/08/17 Javascript
微信小程序 详解页面跳转与返回并回传数据
2017/02/13 Javascript
关于Node.js的events.EventEmitter用法介绍
2017/04/01 Javascript
AngularJS 霸道的过滤器小结
2017/04/26 Javascript
深入理解ES6的迭代器与生成器
2017/08/19 Javascript
ionic2懒加载配置详解
2017/09/01 Javascript
在Debian(Raspberry Pi)树莓派上安装NodeJS的教程详解
2017/09/19 NodeJs
vue 的keep-alive缓存功能的实现
2018/03/22 Javascript
JS通过ajax + 多列布局 + 自动加载实现瀑布流效果
2019/05/30 Javascript
如何解决vue在ios微信&quot;复制链接&quot;功能问题
2020/03/26 Javascript
python爬虫系列Selenium定向爬取虎扑篮球图片详解
2017/11/15 Python
numpy使用fromstring创建矩阵的实例
2018/06/15 Python
Python对CSV、Excel、txt、dat文件的处理
2018/09/18 Python
用Python实现筛选文件脚本的方法
2018/10/27 Python
PyQt5内嵌浏览器注入JavaScript脚本实现自动化操作的代码实例
2019/02/13 Python
python模拟实现分发扑克牌
2020/04/22 Python
Tensorflow--取tensorf指定列的操作方式
2020/06/30 Python
澳大利亚最受欢迎的女士度假服装:Kabana Shop
2020/10/10 全球购物
武汉某公司的C#笔试题面试题
2015/12/25 面试题
缓刑期间思想汇报范文
2014/10/10 职场文书
教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
2014年财务经理工作总结
2014/12/08 职场文书
导游词之台湾安平古堡
2019/12/25 职场文书