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检测主机存活端口及检查存活主机
Oct 12 Python
神经网络python源码分享
Dec 15 Python
tornado 多进程模式解析
Jan 15 Python
python爬虫基础教程:requests库(二)代码实例
Apr 09 Python
Django后端接收嵌套Json数据及解析详解
Jul 17 Python
python数据持久存储 pickle模块的基本使用方法解析
Aug 30 Python
使用python 将图片复制到系统剪贴中
Dec 13 Python
使用tensorflow DataSet实现高效加载变长文本输入
Jan 20 Python
Python3-异步进程回调函数(callback())介绍
May 02 Python
python日志通过不同的等级打印不同的颜色(示例代码)
Jan 13 Python
解决pytorch 保存模型遇到的问题
Mar 03 Python
Python数据分析入门之数据读取与存储
May 13 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环境配置之CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI比较?
2011/10/17 PHP
使用openssl实现rsa非对称加密算法示例
2014/01/24 PHP
Nginx服务器上安装并配置PHPMyAdmin的教程
2015/08/18 PHP
PHP+Ajax验证码验证用户登录
2016/07/20 PHP
基于PHP的登录和注册的功能的实现
2020/08/06 PHP
用JSON做数据传输格式中的一些问题总结
2011/12/21 Javascript
js和jquery分别验证单选框、复选框、下拉框
2015/12/17 Javascript
JS简单获取客户端IP地址的方法【调用搜狐接口】
2016/09/05 Javascript
Bootstrap 下拉多选框插件Bootstrap Multiselect
2017/01/22 Javascript
详解vue中引入stylus及报错解决方法
2017/09/22 Javascript
vue移动端下拉刷新和上拉加载的实现代码
2018/09/08 Javascript
vue实现同一个页面可以有多个router-view的方法
2018/09/20 Javascript
vue-cli脚手架搭建的项目去除eslint验证的方法
2018/09/29 Javascript
[03:23]我的刀塔你不可能这么可爱 第一期金萌萌的故事
2014/06/20 DOTA
python 拷贝特定后缀名文件,并保留原始目录结构的实例
2018/04/27 Python
TensorFlow 合并/连接数组的方法
2018/07/27 Python
python判断数字是否是超级素数幂
2018/09/27 Python
在Python中给Nan值更改为0的方法
2018/10/30 Python
Python3自动签到 定时任务 判断节假日的实例
2018/11/13 Python
python实现随机漫步方法和原理
2019/06/10 Python
使用Python进行防病毒免杀解析
2019/12/13 Python
wxpython多线程防假死与线程间传递消息实例详解
2019/12/13 Python
python virtualenv虚拟环境配置与使用教程详解
2020/07/13 Python
Python通过len函数返回对象长度
2020/10/22 Python
HTML5引入的新数组TypedArray介绍
2012/12/24 HTML / CSS
福克斯租车:Fox Rent A Car
2017/04/13 全球购物
英国健康和美容技术产品购物网站:CurrentBody
2019/07/17 全球购物
Arti-shopping中文官网:大型海外商品一站式直邮平台
2020/03/23 全球购物
创意广告词
2014/03/17 职场文书
大学生第一学年自我鉴定2015
2014/09/28 职场文书
个人四风问题对照检查材料
2014/10/01 职场文书
教师个人发展总结
2015/02/11 职场文书
请病假条范文
2015/08/17 职场文书
2019最新版股权转让及委托持股协议书范本
2019/08/07 职场文书
Win11开始菜单添加休眠选项
2022/04/19 数码科技
openGauss数据库JDBC环境连接配置的详细过程(Eclipse)
2022/06/01 Java/Android