一、yaml简介

yaml:一种标记语言,专门用来写配置文件。

二、yaml基础语法

  • 区分大小写;
  • 使用缩进表示层级关系;
  • 使用空格键缩进,而非Tab键缩进
  • 缩进的空格数目不固定,只需要相同层级的元素左侧对齐;
  • 文件中的字符串不需要使用引号标注,但若字符串包含有特殊字符则需用引号标注;
  • 注释标识为#

三、yaml的数据结构

  • 对象:键值对的集合(简称 "映射或字典")
    键值对用冒号 “:” 结构表示,冒号与值之间需用空格分隔
  • 数组:一组按序排列的值(简称 "序列或列表")
    数组前加有 “-” 符号,符号与值之间需用空格分隔
  • 纯量(scalars):单个的、不可再分的值(如:字符串、bool值、整数、浮点数、时间、日期、null等)
    None值可用null可 ~ 表示
 
四、使用python读取yaml常见的数据结构

前提:python中读取yaml文件前需要安装pyyaml和导入yaml模块。

python读取yaml:

# get_yaml.py

import yaml

def get_yaml_data(yaml_file):
print("*****获取yaml数据*****")
with open(yaml_file, encoding='utf-8')as file:
content = file.read()
print(content)
print(type(content)) print("\n*****转换yaml数据为字典或列表*****")
# 设置Loader=yaml.FullLoader忽略YAMLLoadWarning警告
data = yaml.load(content, Loader=yaml.FullLoader)
print(data)
print(type(data))
print(data.get('my')) # 类型为字典 <class 'dict'>
    # print(data[0]["model"]) # 若类型为列表 <class 'list'>
if __name__ == "__main__":
get_yaml_data("config.yaml")
 
1、yaml键值对:即python中的字典

# config.yaml
user: my
pwd:

运行结果:

*****获取yaml数据*****
# yaml键值对:即python中的字典
user: my
pwd: 1111
<class 'str'> *****转换yaml数据为字典或列表*****
{'user': 'my', 'pwd': 1111}
<class 'dict'>
my

2、yaml键值对嵌套:即python中的字典嵌套字典

# config.yaml

user1:
name: a
pwd: 111222
user2:
name: b
pwd: 222333

运行结果:

*****获取yaml数据*****
user1:
name: a
pwd: 111222
user2:
name: b
pwd: 222333
<class 'str'> *****转换yaml数据为字典或列表*****
{'user1': {'name': 'a', 'pwd': 111222}, 'user2': {'name': 'b', 'pwd': 222333}}
<class 'dict'>
{'name': 'a', 'pwd': 111222}

3、yaml键值对中嵌套数组

# config.yaml

user3:
- a
- b
user4:
- d
- e

运行结果:

*****获取yaml数据*****
user3:
- a
- b
user4:
- d
- e
<class 'str'> *****转换yaml数据为字典或列表*****
{'user3': ['a', 'b'], 'user4': ['d', 'e']}
<class 'dict'>
['a', 'b']

4、yaml数组中嵌套键值对

# config.yaml

- user1: aaa
- pwd1: 111
user2: bbb
pwd2: 222

运行结果:

*****获取yaml数据*****
- user1: aaa
- pwd1: 111
user2: bbb
pwd2: 222
<class 'str'> *****转换yaml数据为字典或列表*****
[{'user1': 'aaa'}, {'pwd1': 111, 'user2': 'bbb', 'pwd2': 222}]
<class 'list'>  # 注意,此时的类型为list而非dict, 所以用下标访问,即data[0]["user1"]
aaa

5、yaml中纯量

# config.yaml

s_val: hello world
num_val: 15
bol_val: true
nul_val: null
data_val: 2020-08-17

运行结果:

*****获取yaml数据*****
s_val: hello world
num_val: 15
bol_val: true
nul_val: null
data_val: 2020-08-17
<class 'str'> *****转换yaml数据为字典或列表*****
{'s_val': 'hello world', 'num_val': 15, 'bol_val': True, 'nul_val': None, 'data_val': datetime.date(2020, 8, 17)}
<class 'dict'>
hello world
 案例实践:
# config.yaml

# 使用-分隔用例,则yaml读取到的数据类型为列表
-
model: 注册模块
title: 注册成功
url: http://api.nnzhp.cn/api/user/user_reg
method: POST
data:
username: yingcr8
pwd: Ace123456
cpwd: Ace123456
check:
error_code: 0
msg: 注册成功!
-
model: 注册模块
title: 用户名长度小于6位,注册失败
url: http://api.nnzhp.cn/api/user/user_reg
method: POST
data:
username: yingc
pwd: Ace123456
cpwd: Ace123456
check:
error_code: 3002
# get_yaml.py

import requests
import yaml
import urllib3
import json
urllib3.disable_warnings() class SignTest(): def __init__(self, file):
self.file = file def test_sign(self):
with open(self.file, encoding='utf-8') as fobj:
content = fobj.read()
       # 使用 yaml.load()将yaml数据转换为list或dict
data = yaml.load(content, Loader=yaml.FullLoader)
       # 使用for循环,依次读取测试用例
for i in range(len(data)):
# 从config.yaml中提取接口的参数
       # 由于读取到的数据类型为list列表,所以只能用下标访问
model = data[i]['model']
title = data[i]['title']
url = data[i]['url']
method = data[i]['method']
datas = data[i]['data']
check = data[i]['check']
self.sign_test(model, title, url, method, datas, check) def sign_test(self, model, title, url, method, datas, check):
print("模块:", model)
print("用例标题:", title)
response = requests.request(url=url, method=method, data=datas)
response = json.loads(response.text)
print(response)
try:
# 通过断言,判断实际结果是否与预期结果一致
assert check['error_code'] == response['error_code']
print("测试通过\n")
except Exception:
print("测试失败\n") if __name__ == "__main__":
signtest = SignTest("config.yaml")
signtest.test_sign()

运行结果:

模块: 注册模块
用例标题: 注册成功
{'error_code': 0, 'msg': '注册成功!'}
测试通过 模块: 注册模块
用例标题: 用户名长度小于6位,注册失败
{'error_code': 3002, 'msg': '用户名长度为6-10位!'}
测试通过
 
参考:https://www.jianshu.com/p/eaa1bf01b3a6

python之读取yaml数据的更多相关文章

  1. Delphi中使用python脚本读取Excel数据

    Delphi中使用python脚本读取Excel数据2007-10-18 17:28:22标签:Delphi Excel python原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 . ...

  2. python中读取mongodb数据并保存为csv格式的文件

    import pandas as pd import matplotlib.pyplot as plt import pymongo %matplotlib inline # 连接mongodb数据库 ...

  3. 【Python】读取excel数据

    '''python3读取excle数据''' import xlrd workbook = xlrd.open_workbook(r'test.xls', encoding_override='gbk ...

  4. python 中读取yaml

    YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便. YAML在python语言中有PyYAML安装包. YAML 语言(发音 /ˈjæməl/ )的设计目标,就是方便人类 ...

  5. python中读取文件数据时要注意文件路径

    我们在用python进行数据处理时往往需要将文件中的数据取出来做一些处理,这时我们应该注意数据文件的路径.文件路径不对,回报如下错误: FileNotFoundError: File b'..Adve ...

  6. Python——pandas读取JSON数据,xml,html数据(python programming)

  7. python分块读取大数据,避免内存不足

  8. python的logging模块之读取yaml配置文件。

    python的logging模块是用来记录应用程序的日志的.关于logging模块的介绍,我这里不赘述,请参见其他资料.这里主要讲讲如何来读取yaml配置文件进行定制化的日志输出. python要读取 ...

  9. Python读取Yaml文件

    近期看到好多使用Yaml文件做为配置文件或者数据文件的工程,随即也研究了下,发现Yaml有几个优点:可读性好.和脚本语言的交互性好(确实非常好).使用实现语言的数据类型.有一个一致的数据模型.易于实现 ...

随机推荐

  1. C#LeetCode刷题之#21-合并两个有序链表(Merge Two Sorted Lists)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3818 访问. 将两个有序链表合并为一个新的有序链表并返回.新链表 ...

  2. CSS动画实例:旋转的圆角正方形

    在页面中放置一个类名为container的层作为效果呈现容器,在该层中再定义十个名为shape的层层嵌套的子层,HTML代码描述如下: <div class="container&qu ...

  3. CC协议是怎么一回事?

    CC协议是怎样的? CC-BY-NC-SA (创作共用许可协议) "知识共享"(CC协议)简单介绍 如何使用CC协议? CC 协议使用 FAQ CC协议选择工具 本文章采用 CC ...

  4. 《MySQL必知必会》过滤数据,数据过滤(where ,in ,null ,not)

    <MySQL必知必会>过滤数据,数据过滤 1.过滤数据 1.1 使用 where 子句 在SEL ECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤. WHERE子句在表名(FR ...

  5. PYTHON替代MATLAB在线性代数学习中的应用(使用Python辅助MIT 18.06 Linear Algebra学习)

    前言 MATLAB一向是理工科学生的必备神器,但随着中美贸易冲突的一再升级,禁售与禁用的阴云也持续笼罩在高等学院的头顶.也许我们都应当考虑更多的途径,来辅助我们的学习和研究工作. 虽然PYTHON和众 ...

  6. 一些Java中不为人知的特殊方法,学完后面试官可能都没你知道的多!

    如果你用过反射并且执行过getDeclaredMethods方法的话,你可能会感到很吃惊.你会发现出现了很多源代码里没有的方法.如果你看一下这些方法的修饰符的话,可能会发现里面有些方法是volatil ...

  7. C++置换的玩笑

    小蒜头又调皮了.这一次,姐姐的实验报告惨遭毒手. 姐姐的实验报告上原本记录着从 1 到 n 的序列,任意两个数字间用空格间隔.但是“坑姐”的蒜头居然把数字间的空格都给删掉了,整个数字序列变成一个长度为 ...

  8. SpringMVC 注解方式进行配置页面跳转

    @ 目录 修改IndexController 修改springmvc-servlet.xml 效果 修改IndexController 在类前面加上@Controller 表示该类是一个控制器 在方法 ...

  9. golang方法

    1.方法声明 在函数声明时,在其名字之前放上一个变量,即是一个方法.这个附加的参数会将该函数附加到这种类型上,即相当于为这种类型定义了一个独占的方法. package main import &quo ...

  10. Python 控制台输出时刷新当前行内容而不是输出新行

    需求目标 执行Python程序的时候在控制台输出内容的时候只显示一行,然后自动刷新内容,像这样: Downloading File FooFile.txt [%] 而不是这样: Downloading ...