yaml 文件解析
前言
yaml文件其实也是一种配置文件类型,相比较ini,conf配置文件来说,更加的简洁,操作也更加简单,同时可以存放不同类型的数据,不会改变原有数据类型,所有的数据类型在读取时都会原样输出,yaml文件依赖python的第三方库PyYaml模块
转载自:https://www.cnblogs.com/linuxchao/p/linuxchao-yaml.html
PyYaml安装
打开CMD执行命令: pip install PyYaml
读yaml文件
1、存字典类型
config.yaml
cnblog: 标题
address: BeiJing
Company: china
age: 18
now: 8.14
empty1: null
empty2: ~
parseyaml.py
import yaml # 定义yaml文件路径
yaml_path = r'C:\Users\ADMIN\Desktop\自动化测试学习\autotest_bysms\cfg\config.yaml' with open(yaml_path,"r",encoding="utf8") as f:
context=yaml.load(f,Loader=yaml.FullLoader)
print("读取内容", context, type(context))
print(context["cnblog"], type(context["cnblog"]))
print(context["age"], type(context["age"]))
print(context["now"], type(context["now"]))
print(context["empty1"], type(context["empty1"]))
输出
读取内容 {'cnblog': '标题', 'address': 'BeiJing', 'Company': 'china', 'age': 18, 'now': 8.14, 'empty1': None, 'empty2': None} <class 'dict'>
标题 <class 'str'>
18 <class 'int'>
8.14 <class 'float'>
None <class 'NoneType'>
None <class 'NoneType'>
结论
当前输出的内容是一个字典类型,
yaml文件中存储的字符串输出仍是字符串类型,int型仍是int型等,
存储None类型可以使用null,~符号以及None,
这也是区别ini配置文件的地方,
且文件内容使用[key:value]的形式定义,当然key和value也可以使用双引号修饰;
2.yaml存多组数据并读取
config.yaml
cnblog: linux超
address: BeiJing
Company: petrochina
age: 18
now: 8.14
---
name: linux超
gender: 男
parseyaml.py
import yaml # 定义yaml文件路径
yaml_path = r'C:\Users\ADMIN\Desktop\自动化测试学习\autotest_bysms\cfg\config.yaml' with open(yaml_path,"r",encoding="utf8") as f:
context=yaml.load_all(f,Loader=yaml.FullLoader)
print("读取内容",context,type(context))
for i in context:
print(i)
输出
读取内容 <generator object load_all at 0x000001CD07257040> <class 'generator'>
{'cnblog': 'linux超', 'address': 'BeiJing', 'Company': 'petrochina', 'age': 18, 'now': 8.14}
{'name': 'linux超', 'gender': '男'}
结论:
当yaml文件存储多组数据在一个yaml文件中时,
需要使用3个横杆分割,
读取数据时需要使用load_all方法,
而且此方法返回一个生成器,
需要使用for循环迭代读取每一组数据下面再看一下yaml如何存储列表类型数据
3.yaml存储列表并读取
config.yaml
- linux超
- BeiJing
- petrochina
- 18
- 8.14
parseyaml.py
import yaml # 定义yaml文件路径
yaml_path = r'C:\Users\ADMIN\Desktop\自动化测试学习\autotest_bysms\cfg\config.yaml' with open(yaml_path,"r",encoding="utf8") as f:
context=yaml.load(f,Loader=yaml.FullLoader) print("读取内容",context,type(context))
输出
读取内容 ['linux超', 'BeiJing', 'petrochina', 18, 8.14] <class 'list'>
结论
当yaml文件存储列表数据时,
需要使用一个横杠[- 元素]表示为列表的一个元素
4.yaml存储元组并读取
config.yml
--- !!python/tuple # 列表转成元组
- 1
- 2
- 3
---
age: !!str 18 # int 类型转换为str
parseyaml.py
import yaml with open("./config.yml", "r", encoding="utf-8") as f:
context = yaml.load_all(f, Loader=yaml.FullLoader)
for i in context:
print(i)
输出
(1, 2, 3)
{'age': '18'} Process finished with exit code 0
结论:
yaml文件使用两个!!号可以对数据进行类型转换
config.yaml
info:
- user:
username: linux超
password: linuxxiaochao
company:
first: petrochina
second: lemon teacher
parseyaml.py
import yaml with open("config.yml", "r", encoding="utf8") as f:
context = yaml.load(f, Loader=yaml.FullLoader)
print("读取内容\n", context, type(context))
输出
读取内容
{'info': [{'user': {'username': 'linux超', 'password': 'linuxxiaochao'}}], 'company': {'first': 'petrochina', 'second': 'lemon teacher'}} <class 'dict'>
读文件小结
实际工作中大概就是存储字典,列表,或者相互嵌套的数据较常见,那么在存储和读取时需要掌握以下几点
1.存储字典时,以[key:value]的形式定义
2.存储列表时,需要使用[- 元素]表示列表
3.存储多组数据时,需要每组数据之间使用3个横杠-分割分割
4.数据嵌套时,需要注意缩进,和编写python代码的缩进规则相同,唯一不同是,yaml中的缩进只要统一即可不需要指定缩进多少
5.读取一组数据时,直接使用load(stream, loader)方法, 读取多组数据时需要使用load_all(stream, loader)方法,此方法返回的是一个生成器,需要使用for循环读取每一组数据,还需要注意两个方法中的最好像我代码中一样传递loader参数为FullLoader,否则会报Warnning
写yaml文件
向yaml文件中写数据就比较简单了,直接使用dump方法和dump_all方法即可,无论多复杂的数据都可以直接写入
dump写入一组数据
import yaml response = {
"status": 1,
"code": "1001",
"data": [
{
"id": 80,
"regname": "toml",
"pwd": "QW&@JBK!#&#($*@HLNN",
"mobilephone": "13691579846",
"leavemount": "0.00",
"type": "1",
"regtime": "2019-08-14 20:24:45.0"
},
{
"id": 81,
"regname": "toml",
"pwd": "QW&@JBK!#&#($*@HLNN",
"mobilephone": "13691579846",
"leavemount": "0.00",
"type": "1",
"regtime": "2019-08-14 20:24:45.0"
}
],
"msg": "获取用户列表成功"
} try:
with open("./config.yml", "w", encoding="utf-8") as f:
yaml.dump(data=response, stream=f, allow_unicode=True)
except Exception as e:
print("写入yaml文件内容失败")
raise e
else:
print("写入yaml文件内容成功")
生成的yaml文件内容
code: '1001'
data:
- id: 80
leavemount: '0.00'
mobilephone: '13691579846'
pwd: QW&@JBK!#&#($*@HLNN
regname: toml
regtime: '2019-08-14 20:24:45.0'
type: '1'
- id: 81
leavemount: '0.00'
mobilephone: '13691579846'
pwd: QW&@JBK!#&#($*@HLNN
regname: toml
regtime: '2019-08-14 20:24:45.0'
type: '1'
msg: 获取用户列表成功
status: 1
dump_all写入多组数据
import yaml response = {
"status": 1,
"code": "1001",
"data": [
{
"id": 80,
"regname": "toml",
"pwd": "QW&@JBK!#&#($*@HLNN",
"mobilephone": "13691579846",
"leavemount": "0.00",
"type": "1",
"regtime": "2019-08-14 20:24:45.0"
},
{
"id": 81,
"regname": "toml",
"pwd": "QW&@JBK!#&#($*@HLNN",
"mobilephone": "13691579846",
"leavemount": "0.00",
"type": "1",
"regtime": "2019-08-14 20:24:45.0"
}
],
"msg": "获取用户列表成功"
} info = {
"name": "linux超",
"age": 18
} try:
with open("./config.yml", "w", encoding="utf-8") as f:
yaml.dump_all(documents=[response, info], stream=f, allow_unicode=True)
except Exception as e:
print("写入yaml文件内容失败")
raise e
else:
print("写入yaml文件内容成功")
生成的yaml文件内容
code: '1001'
data:
- id: 80
leavemount: '0.00'
mobilephone: '13691579846'
pwd: QW&@JBK!#&#($*@HLNN
regname: toml
regtime: '2019-08-14 20:24:45.0'
type: '1'
- id: 81
leavemount: '0.00'
mobilephone: '13691579846'
pwd: QW&@JBK!#&#($*@HLNN
regname: toml
regtime: '2019-08-14 20:24:45.0'
type: '1'
msg: 获取用户列表成功
status: 1
---
age: 18
name: linux超
写yaml文件小结
1.yaml存储数据规则-多组数据使用---分割,
数据嵌套时注意缩进,
存储字典使用[key: value]的形式,存储列表使用[- 元素]的形式,
使用load读一组数据,使用load_all 可以读多组数据
2.yaml文件写入一组数据直接使用dump方法,写入多组数据使用dump_all方法,
注意写入数据带中文,需要指定参数allow_unicode=True
yaml 文件解析的更多相关文章
- yaml文件解析详解
前言 yaml文件是什么?yaml文件其实也是一种配置文件类型,相比较ini,conf配置文件来说,更加的简洁,操作也更加简单,同时可以存放不同类型的数据,不会改变原有数据类型,所有的数据类型在读取时 ...
- YAML文件解析
YAML是“另一种标记语言”的外语缩写,YAML 是一种比JSON(json多层次{ 与 [ 会被搞晕的)更直观的表现形式,展示上更易查错和关系描述.因为不需要一个专业工具就可以排查正确性.YAML目 ...
- springboot中对yaml文件的解析
一.YAML是“YAML不是一种标记语言”的外语缩写 (见前方参考资料原文内容):但为了强调这种语言以数据做为中心,而不是以置标语言为重点,而用返璞词重新命名.它是一种直观的能够被电脑识别的数据序列化 ...
- 使用ruamel.yaml库,解析yaml文件
在实现的需求如下: 同事提供了一个文本文件,内含200多个host与ip的对应关系,希望能在k8s生成pod时,将这些对应关系注入到/etc/hosts中. 网上看文档,这可以通过扩充pod中的hos ...
- python解析yaml文件
YAML语法规则: http://www.ibm.com/developerworks/cn/xml/x-cn-yamlintro/ 下载PyYAML: http://www.yaml.org/ 解压 ...
- 解析YAML文件
YamlMapFactoryBean yamlMapFactoryBean = new YamlMapFactoryBean(); yamlMapFactoryBean.setResources(ne ...
- 用Yaml文件进行元素管理【转】
原文:http://www.cnblogs.com/milanmi/p/4636503.html 如界面有一个按钮,id号是test.如果进行对象化的话,就是test.click就可以了.不用每次都要 ...
- selenium2入门 用Yaml文件进行元素管理 (五)
比如界面有一个按钮,id号是test.如果进行对象化的话,就是test.click就可以了.不用每次都要去创建test对象.如果id号变了,我们也只需要改一下test的名称就行了. 使用Yaml需要用 ...
- golang yaml配置文件解析
yaml文件语法 此模块内容转自:http://www.ruanyifeng.com/blog/2016/07/yaml.html 大小写敏感 使用缩进表示层级关系 缩进时不允许使用Tab键,只允许使 ...
随机推荐
- 痞子衡嵌入式:嵌入式里串口(UART)自动波特率识别程序设计与实现
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是嵌入式里串口(UART)自动波特率识别程序设计与实现. 串口(UART)是嵌入式里最基础最常用也最简单的一种通讯(数据传输)方式,可以说 ...
- 如何实现一个简易版的 Spring - 如何实现 AOP(终结篇)
前言 在 上篇 实现了 判断一个类的方式是符合配置的 pointcut 表达式.根据一个 Bean 的名称和方法名,获取 Method 对象.实现了 BeforeAdvice.AfterReturni ...
- 「题解」USACO15FEB Fencing the Herd G
本文将同步发布于: 洛谷博客: csdn: 博客园: 简书: 题目 题目链接:洛谷 P3122.USACO 官网. 题意概述 给你平面上的一些点和直线,有两种操作: 新加入一个点 \((x,y)\): ...
- 消息队列面试题、RabbitMQ面试题、Kafka面试题、RocketMQ面试题 (史上最全、持续更新、吐血推荐)
文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...
- js02
一.<thead></thead>,<tbody></tbody>:为了使表头和表格内容分开设置样式 1.tbody里边有一个rows.length,获 ...
- NOIP模拟测试26「嚎叫响彻在贪婪的机房·主仆见证了 Hobo 的离别·征途堆积出友情的永恒」
题目比较神仙,注意是题目神仙 贪婪暗示贪心,堆积暗示堆优化$\%\%\%\%\%\%\%$ 两个乱搞$+$一个堆优化$dp$ 嚎叫响彻在贪婪的机房 题解 对于一个序列来说只要他们差的$gcd$不为$1 ...
- ORA-01157:cannot identify/lock data file 6 - see DBWR trace file ORA-01110:data file 6:'/u01/app/oracle/oradata/PRDO2/sysaux02.dbf'
- docker-compose 部署 Apollo 自定义环境
Apollo 配置中心是什么: Apollo是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性. ...
- 65.QT-UDP组播实现多人共享桌面(同时支持收发显示)
这里我们只是简单学习下通过udp组播如何共享桌面demo.帧率上面比较低,毕竟没有用推流,只是简单的将图片发送到组播地址,而加入组播地址的客户端去取数据显示而已. 主要是为了学习UDP知识而写的,真的 ...
- 性能分析之用户数(线程数)/响应时间/TPS的关系
最近在写一些东西的时候,把一些内容整理了一下. 在考虑压力工具中的用户数(有些工具中称为线程数,本文后续都用"用户数"来说明).响应时间.TPS三者之间的关系时,想到之前也有人问起 ...