Python使用PyYAML库读写yaml文件的方法


Posted in Python onApril 06, 2022

Python中yaml文件的读写(使用PyYAML库)。最近在搭建自动化测试项目过程中经常遇到yaml文件的读写,为了方便后续使用,决定记下笔记。

最近在搭建自动化测试项目过程中经常遇到yaml文件的读写,为了方便后续使用,决定记下笔记。

一,YAML 简介

YAML,Yet Another Markup Language的简写,通常用来编写项目配置,也可用于数据存储,相比conf等配置文件要更简洁。

二,YAML 语法

  • 支持的数据类型:

字典、列表、字符串、布尔值、整数、浮点数、Null、时间等

  • 基本语法规则:

1、大小写敏感

2、使用缩进表示层级关系

3、相同层级的元素左侧对齐

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

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

6、None值可用null 和 ~ 表示

7、多组数据之间使用3横杠---分割

8、# 表示注释,但不能在一段代码的行末尾加 #注释,否则会报错

注意:网上查找到各种博客都提到yaml缩进时不能使用tab键,但我在pycharm编辑器里实际使用时是可以使用tab键进行缩进的,读写时并没有报错!

三,安装第三方yaml文件处理库PyYAML

python没有自带的处理yaml文件的库,需要下载第三方库PyYAML 或 ruamel.yaml ,这里我们安装PyYAML。

pip install pyyaml
# 下载速度慢的话加上清华镜像源
pip install pyyaml -i https://pypi.tuna.tsinghua.edu.cn/simple

四,读取yaml文件

1,从yaml中读取字典

yaml中的字典格式如下:

# yaml文件,文件名为yamlData

os: Android
osVersion: 10
account:
  username: xiaoqq
  password: 123456
deviceName: null
appPackage: ~
bool1: True

读取字典代码:

# @author: 给你一页白纸
import yaml
with open('./yamlData.yml', 'r', encoding='utf-8') as f:
    result = yaml.load(f.read(), Loader=yaml.FullLoader)
print(result, type(result))
print(result['os'], type(result['os']))
print(result['osVersion'], type(result['osVersion']))
print(result['account'], type(result['account']))
print(result['account']['username'])
print(result['deviceName'])
print(result['appPackage'])
print(result['bool1'], type(result['bool1']))

读取结果:

{'os': 'Android', 'osVersion': 10, 'account': {'username': 'xiaoqq', 'password': 123456}, 'deviceName': None, 'appPackage': None} <class 'dict'>
Android <class 'str'>
10 <class 'int'>
{'username': 'xiaoqq', 'password': 123456} <class 'dict'>
xiaoqq
None
None
True <class 'bool'>

从读取结果可以看出:

1,读取出来的数据不会改变原数据类型,即yaml里是什么数据类型,读出来就是什么类型。

2,Loader=yaml.FullLoader参数不写的话对结果不会有影响,但运行时会出现警告信息。

3,yaml.load(f.read(), Loader=yaml.FullLoader)也可以写成yaml.load(f, Loader=yaml.FullLoader),读取出来的结果相同。

2,从yaml中读取list

yaml中list格式:数据前加'-' 并使用空格与数据间隔开,如下:

# yaml文件名yamlData

- Android
- 10
- null
- ~
- True

读取list代码:

# @author: 给你一页白纸
import yaml
with open('./yamlData.yml', 'r', encoding='utf-8') as f:
    result = yaml.load(f.read(), Loader=yaml.FullLoader)
print(result, type(result))

读取结果:

['Android', 10, None, None, True] <class 'list'>

3,从yaml中读取元组

yaml中存储元组格式:yaml中使用!!对数据类型进行转换,yaml中tuple由list转换而来。如下:

# yaml文件名yamlData

!!python/tuple
- Android
- 10
- null
- ~
- True

读取元组代码:

# @author: 给你一页白纸
import yaml
with open('./yamlData.yml', 'r', encoding='utf-8') as f:
    result = yaml.load(f.read(), Loader=yaml.FullLoader)
print(result, type(result))

读取结果:

('Android', 10, None, None, True) <class 'tuple'>

在实际使用中,很多的时候往往是多种类型嵌套的数据。如下yaml数据

# yaml文件名yamlData
os: Android
osVersion: 10
account:
  - username1: xiaoqq
  - password1: 123456
  - username2: Lilei
  - password2: 888888
deviceName: null
appPackage: ~
bool1: True

读取结果:

{'os': 'Android', 'osVersion': 10, 'account': [{'username1': 'xiaoqq'}, {'password1': 123456}, {'username2': 'Lilei'}, {'password2': 888888}], 'deviceName': None, 'appPackage': None, 'bool1': True}

4,从yaml中读取多组数据

yaml多组数据时,每组数据之间需要用3横杠分隔'---',如下:

os: Android
osVersion: 10
account1:
  username1: xiaoqq
  password1: 123456
---
os: ios
osVersion: 12
account1:
  username2: Lilei
  password2: 888888

从yaml中读取多组数据时需要使用yaml.load_all()方法,返回结果为一个生成器,需要使用for循环语句获取每组数据。代码如下:

# @author: 给你一页白纸
import yaml
with open('./yamlData.yml', 'r', encoding='utf-8') as f:
    result = yaml.load_all(f.read(), Loader=yaml.FullLoader)
    print(result, type(result))
    for i in result:
        print(i)

读取结果:

<generator object load_all at 0x000001F78EBD5B48> <class 'generator'>
{'os': 'Android', 'osVersion': 10, 'account1': {'username1': 'xiaoqq', 'password1': 123456}}
{'os': 'ios', 'osVersion': 12, 'account1': {'username2': 'Lilei', 'password2': 888888}}

五,写入yaml文件

1,单组数据写入yaml文件

使用yaml.dump()方法,加入allow_unicode=True参数防止写入的中文乱码,如下:

# @author: 给你一页白纸
import yaml
apiData = {
   "page": 1,
   "msg": "地址",
   "data": [{
      "id": 1,
      "name": "学校"
   }, {
      "id": 2,
      "name": "公寓"
      "id": 3,
      "name": "流动人口社区"
   }],
}
with open('./writeYamlData.yml', 'w', encoding='utf-8') as f:
   yaml.dump(data=apiData, stream=f, allow_unicode=True)

写入结果:

data:
- id: 1
  name: 学校
- id: 2
  name: 公寓
- id: 3
  name: 流动人口社区
msg: 地址
page: 1

2,多组数据写入yaml文件

使用yaml.dump_all()方法,如下:

# @author: 给你一页白纸
import yaml
apiData1 = {
   "page": 1,
   "msg": "地址",
   "data": [{
      "id": 1,
      "name": "学校"
   }, {
      "id": 2,
      "name": "公寓"
      "id": 3,
      "name": "流动人口社区"
   }],
}
apiData2 = {
   "page": 2,
      "name": "酒店"
      "name": "医院"
      "name": "养老院"
with open('./writeYamlData.yml', 'w', encoding='utf-8') as f:
   yaml.dump_all(documents=[apiData1, apiData2], stream=f, allow_unicode=True)

写入结果:

data:
- id: 1
  name: 学校
- id: 2
  name: 公寓
- id: 3
  name: 流动人口社区
msg: 地址
page: 1
---
data:
- id: 1
  name: 酒店
- id: 2
  name: 医院
- id: 3
  name: 养老院
msg: 地址
page: 2

在Python中除了PyYAML库之外,还有ruamel.yaml库也可以对yaml文件进行读写操作,后续再记笔记进行介绍。

到此这篇关于Python使用PyYAML库读写yaml文件的方法的文章就介绍到这了,更多相关Python读写yaml文件内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python中使用smtplib和email模块发送邮件实例
Apr 22 Python
python使用paramiko实现远程拷贝文件的方法
Apr 18 Python
Python发送http请求解析返回json的实例
Mar 26 Python
python dataframe 输出结果整行显示的方法
Jun 14 Python
Python3使用TCP编写一个简易的文件下载器功能
May 08 Python
python语言基本语句用法总结
Jun 11 Python
python单线程下实现多个socket并发过程详解
Jul 27 Python
Python之——生成动态路由轨迹图的实例
Nov 22 Python
python新式类和经典类的区别实例分析
Mar 23 Python
python IDLE添加行号显示教程
Apr 25 Python
pytorch查看模型weight与grad方式
Jun 24 Python
使用python批量修改XML文件中图像的depth值
Jul 22 Python
python+pytest接口自动化之token关联登录的实现
Python图像处理库PIL详细使用说明
Apr 06 #Python
Python可变与不可变数据和深拷贝与浅拷贝
Apr 06 #Python
Python 全局空间和局部空间
Apr 06 #Python
Selenium浏览器自动化如何上传文件
Apr 06 #Python
在Python 中将类对象序列化为JSON
Apr 06 #Python
Python中itertools库的四个函数介绍
Apr 06 #Python
You might like
PHP 字符串长度判断效率更高的方法
2014/03/02 PHP
PHP封装的数据库保存session功能类
2016/07/11 PHP
php 计算两个时间相差的天数、小时数、分钟数、秒数详解及实例代码
2016/11/09 PHP
PHP高并发和大流量解决方案整理
2019/12/24 PHP
js form action动态修改方法
2008/11/04 Javascript
js+xml生成级联下拉框代码
2012/07/24 Javascript
javascript中typeof的使用示例
2013/12/19 Javascript
jquery移动节点实例
2015/01/14 Javascript
jquery.form.js实现将form提交转为ajax方式提交的方法
2015/04/07 Javascript
详解javascript 正则表达式之分组与前瞻匹配
2018/05/30 Javascript
vue+element加入签名效果(移动端可用)
2019/06/17 Javascript
微信小程序canvas分享海报功能
2019/10/31 Javascript
JavaScript Reflect Metadata实现详解
2019/12/12 Javascript
修改vue源码实现动态路由缓存的方法
2020/01/21 Javascript
JavaScript数组排序的六种常见算法总结
2020/08/18 Javascript
[07:20]2014DOTA2西雅图国际邀请赛 选手讲解积分赛第二天
2014/07/11 DOTA
编写Python CGI脚本的教程
2015/06/29 Python
好用的Python编辑器WingIDE的使用经验总结
2016/08/31 Python
Python 'takes exactly 1 argument (2 given)' Python error
2016/12/13 Python
使用pygame模块编写贪吃蛇的实例讲解
2018/02/05 Python
深入了解Python枚举类型的相关知识
2019/07/09 Python
Python逐行读取文件内容的方法总结
2020/02/14 Python
几个解决兼容IE6\7\8不支持html5标签的几个方法
2013/01/07 HTML / CSS
百联网上商城:i百联
2017/01/28 全球购物
VICHY薇姿英国官网:全球专业敏感肌护肤领先品牌
2017/07/04 全球购物
北美个性化礼品商店:Things Remembered
2018/06/12 全球购物
碧欧泉法国官网:Biotherm法国
2019/10/23 全球购物
俄罗斯电动工具和设备购物网站:Vseinstrumenti.ru
2020/11/12 全球购物
三方合作协议书范本
2014/04/18 职场文书
家长评语怎么写
2014/12/30 职场文书
大学生入党自传2015
2015/06/26 职场文书
2015年办税服务厅工作总结
2015/07/23 职场文书
七年级思品教学反思
2016/02/20 职场文书
React四级菜单的实现
2022/04/08 Javascript
《火纹风花雪月无双》预告“神秘雇佣兵” 紫发剑客
2022/04/13 其他游戏
JavaScript实现一键复制内容剪贴板
2022/07/23 Javascript