1、PyYaml是Python的一个专门针对yaml文件操作的模块
2、安装:
C:\Users\admin>pip install pyyaml
Requirement already satisfied: pyyaml in c:\python36\lib\site-packages
3、使用非常简单,就像 json 一样、load和dump就能满足基本的需求。
4、load() 字符串转字典
import yaml
str1 = '''
name: storm # 这里冒号后面有空格
age: 30
sex: 男
'''
str2 = """ # 这里是双引号
name: storm
age: 30
sex: 男
"""
y1 = yaml.load(str1)
y2 = yaml.load(str2)
print(y1)
print(type(y1))
print('='*50)
print(y2)
print(type(y2))
C:\Python36\python.exe E:/python/test1/day1/test_yaml.py
{'name': 'storm', 'age': 30, 'sex': '男'}
==================================================
{'name': 'storm', 'age': 30, 'sex': '男'}
Process finished with exit code 0
总结:
(1)使用双引号或单引号包裹数据都可以;
(2)数据内容使用冒号分隔,冒号后面必须跟空格,如果不跟空格,转化不成字典
(3)数据冒号前后,无论是中、英文、数字都不需要用引号引起来(这本来就是个字符串,外面有双引号或单引号,只不过这个字符串是字典格式的)
5、dump() 字典转字符串
import yaml
dict1 = {
"name":"duzl",
"age":20,
"sex":"男"
}
y = yaml.dump(dict1, default_flow_style=False)
s = yaml.dump(dict1)
print(y)
print(type(y))
print('='*50)
print(s)
print(type(s))
C:\Python36\python.exe E:/python/test1/day1/test_yaml.py
age: 20
name: duzl
sex: "\u7537"
==================================================
{age: 20, name: duzl, sex: "\u7537"}
Process finished with exit code 0
总结:
(1)如果不用default_flow_style=False,虽然也会转成字符串,但格式未去掉大括号
(2)正确用法是设置default_flow_style=False
二、yaml 语法
1、准备测试环境
创建一个test.yaml文件
创建一个testyaml.py文件,用来处理test.yaml文件
import yaml
y = yaml.load(open('test.yaml', 'r',encoding="utf-8"))
print(y)
print(y.get('name'))
C:\Python36\python.exe E:/python/test1/day1/test_yaml1.py
{'name': 'duzl', 'age': 30, 'sex': '男'}
duzl
总结:
(1)通过open读取yaml文件
(2)如果yaml文件中有中文,open读取文件的时候需要指定编码为encoding=“utf-8”,否则会产生乱码,报错
(3)load完产生字典,就可以使用字典的get方法取key所对应的值了
2、yaml基本语法规则
- 大小写敏感
- 使用缩进表示层级关系
- 缩进时不允许使用Tab,只允许使用空格
- 缩进的空格数目不重要,只要相同层级的元素左对齐即可
- # 表示注释,从它开始到行尾都被忽略
3、yaml 转字典
#以下格式会转成dict
name: duzl #注意冒号后面有空格
age: 30
sex: 男
4、yaml 转列表
#以下格式会转成list
- duzl #注意横线后面有空格
- 30
- 男
5、复合结构
yaml文件:
#以下格式会转成list
- name: duzl
age: 30
- name: nancy
age: 20
脚本文件:
import yaml
y = yaml.load(open('test1.yaml', 'r',encoding="utf-8"))
print(y)
print(type(y))
运行结果:
C:\Python36\python.exe E:/python/test1/day1/test_yaml1.py
[{'name': 'duzl', 'age': 30}, {'name': 'nancy', 'age': 20}]
6、分段
在一个yaml文件中,可以使用---来分段(3个横线),这样可以将多个文档写入一个文件中。
比如,yaml文件如下
#使用---,3个横线分段
---
name: duzl
age: 30
---
name: nancy
age: 20
这个就可以使用load_all()方法,load_all方法会生产一个迭代器,可以用for循环输出:
import yaml
ys1 = yaml.load_all(open('test1.yaml', 'r',encoding="utf-8"))
print(ys1)
for y in ys1:
print(y)
C:\Python36\python.exe E:/python/test1/day1/test_yaml.py
[{'name': 'duzl', 'age': 30}, {'name': 'nancy', 'age': 20}]
使用load方法处理结果如下:
import yaml
ys = yaml.load(open('test1.yaml', 'r',encoding="utf-8"))
print(ys)
for y in ys:
print(y)
C:\Python36\python.exe E:/python/test1/day1/test_yaml1.py
[{'name': 'duzl', 'age': 30}, {'name': 'nancy', 'age': 20}]
{'name': 'duzl', 'age': 30}
{'name': 'nancy', 'age': 20}
三、我们将yaml应用到自动化测试中,将要打开的网址从case中分离出来
创建一个yaml文件,config.yaml
URL: http://www.baidu.com
case:
import yaml
from selenium import webdriver
import time
y = yaml.load(open('config.yml','r'))
url = y.get('URL')
driver = webdriver.Chrome()
driver.get(url)
time.sleep(2)
driver.quit()
这样我们就实现了要打开的url和测试用例分离,这个比较简单
稍后我们实现一个通过读取配置文件发送邮件的例子,将发件人、收件人等信息都配置到配置文件中
改进之前,发件人,收件人等信息都放在了用例文件中
import yaml
from selenium import webdriver
import time
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
host = 'smtp.163.com'
sender = '[email protected]'
passwd = 'aaabbb'
receiver = '[email protected]'
msg = MIMEMultipart()
msg['from'] = sender
msg['to'] = receiver
msg['subject'] = '主题'
msg.attach(MIMEText('邮件正文'))
att1 = MIMEText(open('test1.xls','rb').read(),'base64','utf-8')
att1["Content-Type"] = 'application/octet-stream'
# 这里的filename可以任意写,写什么名字,邮件中显示什么名字
att1["Content-Disposition"] = 'attachment; filename="testresult.xls"'
msg.attach(att1)
try:
smtpobj = smtplib.SMTP(host,port=25)
smtpobj.login(sender,passwd)
smtpobj.sendmail(sender,receiver,msg.as_string())
smtpobj.quit()
print('send success')
except:
print('send err')
将那些数据从case中分离出来到配置文件
config.yml配置文件
mail:
host: smtp.163.com
sender: [email protected]
passwd: aaabbb
receiver: [email protected]
subject: 测试主题,随时修改
测试脚本变更为
import yaml
from selenium import webdriver
import time
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
y = yaml.load(open('config.yml','r',encoding='utf-8'))
host = y.get('mail').get('host')
sender = y.get('mail').get('sender')
passwd = y.get('mail').get('passwd')
receiver = y.get('mail').get('receiver')
msg = MIMEMultipart()
msg['from'] = sender
msg['to'] = receiver
msg['subject'] = y.get('mail').get('subject')
msg.attach(MIMEText('邮件正文'))
att1 = MIMEText(open('test1.xls','rb').read(),'base64','utf-8')
att1["Content-Type"] = 'application/octet-stream'
# 这里的filename可以任意写,写什么名字,邮件中显示什么名字
att1["Content-Disposition"] = 'attachment; filename="testresult.xls"'
msg.attach(att1)
try:
smtpobj = smtplib.SMTP(host,port=25)
smtpobj.login(sender,passwd)
smtpobj.sendmail(sender,receiver,msg.as_string())
smtpobj.quit()
print('send success')
except:
print('send err')
好,最后再总结一下:
yaml文件格式操作很方便,有点类似dict
通过PyYaml模块可以方便的处理yaml格式文件
yaml文件通过load,可以转化成字典,然后通过key可以取到对应的值,从而达到读取配置文件,实现配置与脚本分离的目的。
So Easy!