5、Python 处理 yaml 文件

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!

你可能感兴趣的:(Selenium,+,Python,Python)