python外部数据源文件处理
JSON
JSON是一个轻量级的数据交换语言,该语言以易于让人阅读的文字为基础,用来传输由属性值或者序列性的值组成的数据对象(接口测试时常有)
python json的官方文档:https://docs.python.org/3/library/json.html
JSON的读写
- json.dumps
- 是将dict类型转换为string
- json.dump
- 是将dict类型转换为json格式字符串,存入文件
- json.loads
- 基于string,是将json格式字符串string转换为dict
- json.load
- 反序列化,是将json格式字符串文件转化为dict
(加了s是对于string的操作,不加s是对文件的操作)
- 反序列化,是将json格式字符串文件转化为dict
import json class PracticeJson: def __init__(self): self.data={"a":1,"b":2} def practice_dumps(self): //#将dict转化为字符串 print(type(self.data)) // #打印结果:<class 'dict'> print(json.dumps(self.data)) // #打印结果:{"a": 1, "b": 2} print(type(json.dumps(self.data))) //#打印结果:<class 'str'> def practice_dump(self): //#将dict转化为json文件 with open("./demo.json","w") as fs: json.dump(self.data,fp=fs) def practice_loads(self): //#将json格式string转换为dict json_data = json.dumps(self.data) print(type(json_data)) // #打印结果:<class 'str'> print(json.loads(json_data)) //#打印结果:{'a': 1, 'b': 2} print(type(json.loads(json_data))) //#打印结果:<class 'dict'> def practice_load(self): //#将json格式字符串文件转化为dict print(json.load(open("demo.json"))) //#打印结果:{'a': 1, 'b': 2}
json.dumps常用参数
- sort.keys:输出时字典是键值排序的,而不是随机的
- indent:缩进,可以更好地看清结构
- json需要字典的键是字符串,否则会抛出ValueError
print(json.dumps(self.data, sort_keys=True,indent=4))
打印结果:Excel
直观的界面,出色的计算功能
好用的第三方库集合:http://www.python-excel.org/
openpyxl库:https://openpyxl.readthedocs.io/en/stable/
python中创建以及写入excel文件
from openpyxl import Workbook from openpyxl.utils import get_column_letter wb = Workbook() //#实例化workbook dest_filename = 'empty_book.xlsx' //#命名文件 ws1 = wb.active //#获取当前页签 ws1.title = "range names" //#命名页签 for row in range(1, 40): //#row:行 ws1.append(range(600)) ws2 = wb.create_sheet(title="Pi") ws2['F5'] = 3.14 ws3 = wb.create_sheet(title="Data") for row in range(10, 20): for col in range(27, 54): _ = ws3.cell(column=col, row=row, value="{0}".format(get_column_letter(col))) print(ws3['AA10'].value) wb.save(filename = dest_filename) //#保存文件
读取excel
from openpyxl import load_workbook wb = load_workbook(filename = 'empty_book.xlsx') #读取empty_book sheet_ranges = wb['range names'] #页签 print(sheet_ranges['D18'].value)
练习1
写入一组身高体重excel文件
读取写入的excel数据
计算是否为健康体重,如果是健康体重,则在旁边备注健康,并打印(健康体重计算公式:(身高cm-70)*60%)
from openpyxl import Workbook, load_workbook class PracticeExcel: def create_data(self): """ 创建excel数据 :return: """ wb =Workbook() ws1 = wb.active ws1.title = 'create' #页签 ws1["A1"] = '身高' ws1["B1"] = '体重' #方法1:列表写入 # height = [180, 160, 170, 155] # weight = [60, 55, 60, 80] # for i in range(len(height)): # ws1.cell(row=i+2,column=1).value = height[i] #cell:找单元格(通过行列找),value去拿单元格的值 # ws1.cell(row=i+2,column=2).value = weight[i] #方法2:字典写入 data_dict = {180:60,160:54,170:60,155:80} data_keys=[i for i in data_dict.keys()] for i in range(len(data_keys)): ws1.cell(row=i+2,column=1).value =data_keys[i] #cell:找单元格(通过行列找),value去拿单元格的值 ws1.cell(row=i+2,column=2).value = data_dict[data_keys[i]] wb.save("data.xlsx") def read_data(self): ld = load_workbook(filename="data.xlsx") sheet = ld["create"] for i in range(5): print(sheet.cell(row=i + 1, column=1).value) def heathy_data(self): ld = load_workbook(filename="data.xlsx") sheet = ld["create"] sheet.cell(row=1, column=3).value = "备注" for i in range(4): height = sheet.cell(row=i+2,column=1).value weight = sheet.cell(row=i+2,column=2).value heathy_weight = (height - 70) * 0.6 if weight == heathy_weight: print("这是一个健康体重",weight) sheet.cell(row=i+2,column=3).value = "健康体重" ld.save(filename="data.xlsx") pe = PracticeExcel() pe.heathy_data()
练习2
1、打开百度
2、输入搜索词
3、点击搜索
4、将元素定位和输入的数据使用的excel管理
import time import selenium from openpyxl import Workbook, load_workbook from selenium import webdriver class SeleniumPython: def __init__(self): ld = load_workbook("./selenium.xlsx") self.ws = ld.worksheets[0] #print(self.ws["A2"].value) #kw def go_baidu(self): """ 1、打开百度 2、输入搜索词 3、点击搜索 将元素定位和输入的数据使用的excel管理 :return: """ #实例化driver driver = webdriver.Chrome() driver.get("https://www.baidu.com/") driver.find_element_by_id(self.ws["A2"].value).send_keys(self.ws["B2"].value) driver.find_element_by_id(self.ws["A3"].value).click() time.sleep(15) if __name__ == '__main__': sp = SeleniumPython() sp.go_baidu() __name__代表:如果是当前模块就返回一个__main__,如果是非当前模块,就不会返回__main__
YAML
YAML是一个可读性高,用来表达数据序列化的格式,常常作为配置文件使用
- 官方文档 https://pyyaml.org/wiki/PyYAMLDocumentation
- 导入 import yaml
yaml.dump
- yaml.dump函数接收一个Python对象并生成一个YAML文档
- 直接转换
import yaml data = [1,2,3] print(yaml.dump(data))
打印结果: - 转换为yaml文件(生成一个.yml文件)
with open("demo.yml","w") as f: yaml.dump(data,f)
yaml.load(推荐使用yaml.safe_load,更加安全)
- 直接转换
- yaml.load可以将yaml格式/文件转换为列表/字典
- 直接转yam格式
打印:[1,2,3] - 将yaml文件转化为列表/字典
print(yaml.safe_load(open("./demo.yml")))
打印:[1,2,3]
- 直接转yam格式
yaml语法
- 大小写敏感
- 使用缩进表示层级关系
- 缩进的空格数不重要,只要相同层级的元素左侧对齐即可
- “#”表示注释,从这个字符一直到行尾,都会被解析器忽略,这个和python的注释一样
yaml支持的数据结构
- 对象:键值对的集合(字典)——冒号后面一定要加空格
- python中的字典在yaml中如何书写?
- python中的字典嵌套字典在yaml中如何书写?
data = {"a":1,"b":2,"c":{"a":4,"b":5,"z":6}} with open("./demo2.yml","w") as f: yaml.dump(data,f)
结果:
- python中的字典在yaml中如何书写?
- 数组:列表——yaml里面写一个列表,前面加一个"-"符号
- 列表:[1,2,3]
- 嵌套[[2,3],[4,5]]
- 列表:[1,2,3]
- 纯量:单个的、不可再分的值、字符串、布尔值、整数、浮点数、Null、时间、日期
- 1、int 和 float类型的数字
- 2、布尔值用true和false表示
- 3、None用~表示
- 4、日期采用复合iso8601格式的年、月、日表示
- 5、使用两个感叹号,强制转换数据类型
yaml格式: int1: 1 float1: 12.30 bool1: true bool2: false none1: ~ time: 2020-05-10 n1: !!str 123
打印结果: print(yaml.safe_load(open("./data_type.yml")))
yaml实例
使用yaml进行之前身高体重读取
import yaml class PythonYaml: def __init__(self): self.data = yaml.safe_load(open("./data.yml")) def read_list(self): for i in range(len(self.data["height"])): print("身高是{},体重是{}".format(self.data["height"][i],self.data["weight"][i])) if __name__ == '__main__': py = PythonYaml() py.read_list()
yaml文档:
打印结果: