详解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之一个免费的实验室
Sep 14 Python
python3.5仿微软计算器程序
Mar 30 Python
Python3.x对JSON的一些操作示例
Sep 01 Python
Python文件操作基本流程代码实例
Dec 11 Python
python实现关键词提取的示例讲解
Apr 28 Python
Python连接Redis的基本配置方法
Sep 13 Python
Python range、enumerate和zip函数用法详解
Sep 11 Python
基于Python中isfile函数和isdir函数使用详解
Nov 29 Python
tf.concat中axis的含义与使用详解
Feb 07 Python
django form和field具体方法和属性说明
Jul 09 Python
基于Python的图像阈值化分割(迭代法)
Nov 20 Python
你需要掌握的20个Python常用技巧
Feb 28 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获取操作系统语言代码
2013/11/04 PHP
php自动加载autoload机制示例分享
2014/02/20 PHP
浅谈PHP中output_buffering
2015/07/13 PHP
thinkphp3.2.3版本的数据库增删改查实现代码
2016/09/22 PHP
用PHP做了一个领取优惠券活动的示例代码
2019/07/05 PHP
浏览器无法运行JAVA脚本的解决方法
2008/01/09 Javascript
JS重要知识点小结
2011/11/06 Javascript
Javascript中的for in循环和hasOwnProperty结合使用
2013/06/05 Javascript
简单的ajax连接库分享(不用jquery的ajax)
2014/01/19 Javascript
以jQuery中$.Deferred对象为例讲解promise对象是如何处理异步问题
2015/11/13 Javascript
yarn与npm的命令行小结
2016/10/20 Javascript
Javascript中call,apply,bind方法的详解与总结
2016/12/12 Javascript
JS实现区分中英文并统计字符个数的方法示例
2018/06/09 Javascript
JS+canvas画布实现炫酷的旋转星空效果示例
2019/02/13 Javascript
Node.js 实现远程桌面监控的方法步骤
2019/07/02 Javascript
ES6中let、const的区别及变量的解构赋值操作方法实例分析
2019/10/15 Javascript
使用JavaScrip模拟实现仿京东搜索框功能
2019/10/16 Javascript
JavaScript async/await原理及实例解析
2020/12/02 Javascript
Python操作串口的方法
2015/06/17 Python
Python开发中爬虫使用代理proxy抓取网页的方法示例
2017/09/26 Python
python调用Delphi写的Dll代码示例
2017/12/05 Python
几种实用的pythonic语法实例代码
2018/02/24 Python
python 自定义对象的打印方法
2019/01/12 Python
对python 中re.sub,replace(),strip()的区别详解
2019/07/22 Python
解析python 类方法、对象方法、静态方法
2020/08/15 Python
Python confluent kafka客户端配置kerberos认证流程详解
2020/10/12 Python
python利用文件时间批量重命名照片和视频
2021/02/09 Python
html5 标签
2009/07/16 HTML / CSS
英国婴儿和儿童服装网站:Vertbaudet
2018/04/02 全球购物
存储过程和函数的区别
2013/05/28 面试题
学前教育毕业生自荐信
2013/10/29 职场文书
《金色的脚印》教后反思
2014/04/23 职场文书
小学生植树节活动总结
2014/07/04 职场文书
Python趣味挑战之实现简易版音乐播放器
2021/05/28 Python
解决springboot druid数据库连接失败后一直重连的方法
2022/04/19 Java/Android
JavaScript架构搭建前端监控如何采集异常数据
2022/06/25 Javascript