python 操作 excel
课程-数据分离结合excel实际应用(35min开始)
1.为什么要用excel?
通过python操作excel,是因为现在主流的测试用例的数据是写在Exel当中的。
Excel是一种比较规范的数据格式,能够处理大批量的数据
(自动化测试的数据一般在excel,CSV,yaml)
2.安装openpyxl
安装方式:pip install openxl
3.excel的三大对象:
- WorkBook:工作簿对象
- Sheet:表单对象
4.读取excel数据的步骤
1).打开文件 得到一个工作簿
2).选择表单
3).通过行列读取数据
下面黄底是为了后面sheet操作,有提示信息,方便写代码的,可加可不加
#导入openpyxl库 import openpyxl #写好一个excel文件数据,拷贝到当前文件的同级目录下(cases.xlsx) #打开文件 from openpyxl.worksheet.worksheet import Worksheet workbook = openpyxl.load_workbook('cases.xlsx') #获取表单 sheet:Worksheet = workbook['Sheet1'] #获取某一行 某一列的单元格 # cell() 得到的是一个单元格对象 不是单元格的值 cell = sheet.cell(row = 1,column = 2) print(cell)#<Cell 'Sheet1'.B1> #获取单元格的值 print(cell.value)#module
上面的获取的是单元格的数据,如何获取所有的行数据呢?
#获取所有的行 rows = list(sheet.rows) pprint(rows)#pprint输出好看 for row in rows: for cell in row: print(cell.value)
5.总结 openpyxl步骤
1).pip install openpyxl
2).导入openpyxl
import openpyxl
from openpyxl import load_workbook
3).三大对象
①workbook 对象-----工作簿
openpyxl.load_workbook()得到的返回值就是一个workbook对象
② sheet 对象-------表单
sheet=workbook['表单名']
③cell 对象---------单元格
cell = sheet.cell()
data = cell.value
6.使用generator生成器注意的坑
#获取到所有的行----生成器对象 generator gen = sheet.rows print(list(gen)) rows = list(gen) print(rows)#空列表[]
generator生成器只能用一次list转化,再次转化的结果是空列表。---------使用生成器转换成list,只能使用一次
以上学习了读取excel的数据,下面开始学习写入excel数据
7.excel写入操作-----直接对cell当中的value属性赋值
回顾一下读取
print(cell.value) print(sheet.cell(row = 2,column = 3).value)
①写入数据,直接赋新值
cell.value = 'login failed' #或 sheet.cell(row = 2,column = 3).value = 'login failed'
上面修改,但是没有保存还是无法实现写入数据,保存后并进行关闭文件操作
②写入数据后保存
保存文件语法:工作簿.save('文件路径')
先来看一下save()的源码
def save(self, filename): """Save the current workbook under the given `filename`. Use this function instead of using an `ExcelWriter`.
为什么save()参数要加文件名--------因为保存分保存、另存为
写入数据操作如下(只能一个单元格写入,批量写入用for循环):
#导入openpyxl库 import openpyxl #打开文件 workbook = openpyxl.load_workbook('cases.xlsx') #获取表单 sheet = workbook['Sheet1'] #获取某一行 某一列的单元格 # cell() 得到的是一个单元格对象 不是单元格的值 cell = sheet.cell(row = 2,column = 3) #获取单元格的值 print(cell.value) #以下进行写入数据操作 #读取数据 print(sheet.cell(row = 2,column = 3).value) #写入数据 sheet.cell(row = 2,column = 3).value = 'login failed!!!' print(cell.value) #保存文件 语法:工作簿.save('文件路径') workbook.save('cases.xlsx') #关闭文件 workbook.close()
将python操作excel的各个方法(打开excel, 获取表单sheet, 读取数据cell.value, 写入数据 sheet.cell(row,column).value=data, 保存save,关闭close),封装成类
#导入openpyxl import openpyxl #封装成类 class ExcelHandler: def __init__(self,file_path): '''初始化''' self.file_path = file_path self.workbook = None def open_excel(self): '''打开excel文件''' workbook = openpyxl.load_workbook(self.file_path) self.workbook = workbook return workbook def get_sheet(self,name): '''获取sheet表单''' workbook = self.open_excel() return workbook[name] def read_data(self,sheet_name): '''读取数据''' sheet = self.get_sheet(sheet_name) rows = list(sheet.rows) data = [] rows = list(sheet.rows) headers = [] for title in rows[0]: headers.append(title.value) for row in rows[1:]: row_data = {} for idx, cell in enumerate(row): row_data[headers[idx]] = cell.value data.append(row_data) self.close() return data def write_data(self,sheet_name,row,column,data): '''写入数据''' sheet = self.get_sheet(sheet_name) sheet.cell(row,column).value = data self.save() self.close() def save(self): '''保存文件''' self.workbook.save(self.file_path)# workbook属性没有,在__init__初始化为None,在open()里面重新赋值 def close(self): '''关闭文件''' self.workbook.close() # workbook属性没有,在__init__初始化为None if __name__ =='__main__' : #实例化demo1对象 demo1 = ExcelHandler('cases.xlsx') print(demo1.read_data('Sheet1'))
上述的封装类中,在方法中self调用实例属性,没有这个属性,可以在__init__()中初始化,值为None