python 操作excel(openpyxl.load_workbook)、excel操作封装

操作excel

其他的库:

  • xlrd xlwt : 过时了,只能操作xls后缀的文件。
  • pandas:大数据测试 数据分析项目会用。

openpyxl:第三方库 支持的格式有:.xlsx、.xlsm、.xltx、.xltm,l不支持.xls文件格式【转化】

-1)安装 :pip + pycharm两种方式安装都可以

-2)导入:全部导入 和部分导入

excel表格操作有几个概念和相关的操作:

  • 工作簿: 表格本身,workbook
  • 表单: sheet
  • 单元格: cell 有某行某列决定表格
  • 单元格里的数据: value

读取excel表格里所有内容:sh.values

  • 这是一个生成器:测试开发高级编程里会学的。== 可以转化。--list转化为列表
  • 列表: 列里嵌套元组的数据。每行数据存在一个元组里,最终存在一个大列表里。
    • 第一行数据存在第一个元组里; 标题
    • 第二行数据存在第二个元组: 第一条测试用例数据
    • 第三行数据存在第三个元组: 第二条测试用例数据
      ...
      如果分别获取每行的数据? -- for循环遍历。

操作excel

python 复制代码
# import openpyxl
from openpyxl import load_workbook
from pathlib import Path


# 0、路径处理: 文件不能写绝对路径 用相对路径处理
exc_path = Path(__file__).absolute().parent / "testcase65.xlsx"

# 1、加载工作簿对象
wb = load_workbook(exc_path)

# 2、找到读取数据的表单: login
sh = wb["login"]

#3、找到单元格: cell 某行某列决定表格  -- 行和列是从1开始的
cell = sh.cell(row=1,column=1)

#4、得到单元格里的内容 -value
cell_value = sh.cell(row=1,column=1).value
# print(cell_value)

# 5、读取所有内容 -- for循环遍历到每一行的数据。
# print(list(sh.values))
# for row in sh.values:
    # print(row)

# 6、扩展: 获取部分内容  某个区间的行列 == 元组的嵌套  每行数据是一个元组
# part_value = sh["A1:C3"]
# print(part_value)
# for row in part_value:
    # print(row) # (<Cell 'login'.A1>, <Cell 'login'.B1>, <Cell 'login'.C1>)
    # for col in row:
        # print(col.value)

# 7、修改的操作 --了解 单元格的内容进行重新赋值, 一定要记得保存。
sh.cell(row=1, column=1).value = "case_id"
# 保存操作
wb.save("testcase65.xlsx")
# 关闭excel
wb.close()

读取内容数据类型

excel读取的数据的类型的问题总结:

  • 如果单元格里只有数字,那么读取出来直接是数字-- 整型或者浮点型
  • 如果单元格为空(没有编辑过数据)读取出来是 None == 注意空格是字符串 不是None 【注意不是null】
  • 如果单元格当中用只有TRUE FALSE (excel表格会自动默认大写), 那么读取转化为布尔值类型--True False;
  • 如果单元格只有时间格式 : 2023/07/22,那么读取出来就是 datatime类型 - 年月日时分秒 - datetime.datetime(2023, 7, 22, 0, 0)
  • 以上都不是,那么就是字符串的类型;比如列表 字典等数据 读取出来是字符串:因为excel表格不认识字典这些数据类型 所以都是字符串
    • 注意的问题: '{"Content-Type":"application/json"}'
      -- 转化为字典[python识别的数据类型 再去操作]: eval() jsonpath
python 复制代码
# import openpyxl
from openpyxl import load_workbook
from pathlib import Path


# 0、路径处理: 文件不能写绝对路径 用相对路径处理
exc_path = Path(__file__).absolute().parent / "testcase65.xlsx"

# 1、加载工作簿对象
wb = load_workbook(exc_path)

# 2、找到读取数据的表单: login
sh = wb["login"]

#3、找到单元格: cell 某行某列决定表格  -- 行和列是从1开始的
cell = sh.cell(row=1,column=1)

#4、得到单元格里的内容 -value
cell_value = sh.cell(row=2,column=7).value
print(cell_value,type(cell_value))

excel在项目中的应用

接口自动化测试的项目实战-- 存储为Python数据格式。原则: 方便读取数据

  • 每一条用例用字典存储,因为有key可以表示什么是意义的数据; 读取也通过key 辨别什么意义数据;
  • 多条用例存在列表数据类型里,相同意义的数据存在列表 按照索引取值。
  • excel表格里读取出来 存储格式为 : [{key:value},{},{},{}]
    • key:可以直接来自于excel表格第一行数据 --用例标题行
    • value:每一条用例 == 从第二行开始的每一行
python 复制代码
from openpyxl import load_workbook
from pathlib import Path


exc_path = Path(__file__).absolute().parent / "testcase65.xlsx"
wb = load_workbook(exc_path)
sh = wb["login"]
cases = list(sh.values)  # 所有的用例的列表  [(第一行-title),(第二行用例),(),()]
title = cases[0] # 得到标题行
list_case = []
for case in cases[1:]:
    data = dict(zip(title,case))  # 第一条用例的字典
    list_case.append(data)  # 每一条用例追加到列表里。
print(list_case)

# 简化列表推导式?
# cases = list(sh.values)  # 所有的用例的列表  [(第一行-title),(第二行用例),(),()]
# title = cases[0] # 得到标题行
# list_case = [ dict(zip(title,case)) for case in cases[1:]]

excel操作的封装

接口自动化测试的项目实战-- 存储为Python数据格式。原则: 方便读取数据

  • 每一条用例用字典存储,因为有key可以表示什么是意义的数据; 读取也通过key 辨别什么意义数据;
  • 多条用例存在列表数据类型里,相同意义的数据存在列表 按照索引取值。
  • excel表格里读取出来 存储格式为 : [{key:value},{},{},{}]
    • key:可以直接来自于excel表格第一行数据 --用例标题行
    • value:每一条用例 == 从第二行开始的每一行

因为这个方法会经常使用到,所以我们需要做封装。

-思考?封装成类还是函数呢?--函数比较好。

  • 封装函数的步骤:
    • 1、功能代码写出来
    • 2、def 封装 + 缩进
    • 3、参数化:
    • 4、返回值:
python 复制代码
from pathlib import Path

from openpyxl import load_workbook

def read_data(exc_path,sheetname):
    """
    这是读取excel表格函数
    :param exc_path: 用例文件的路径
    :param sheetname: 用例表单的名字
    :return:
    """
    wb = load_workbook(exc_path)
    sh = wb[sheetname]
    cases = list(sh.values)  # 所有的用例的列表  [(第一行-title),(第二行用例),(),()]
    title = cases[0] # 得到标题行
    list_case = []
    for case in cases[1:]:
        data = dict(zip(title,case))  # 第一条用例的字典
        list_case.append(data)  # 每一条用例追加到列表里。
    return list_case

# 简化列表推导式?
# cases = list(sh.values)  # 所有的用例的列表  [(第一行-title),(第二行用例),(),()]
# title = cases[0] # 得到标题行
# list_case = [ dict(zip(title,case)) for case in cases[1:]]

if __name__ == '__main__':
    exc_path = Path(__file__).absolute().parent / "testcase65.xlsx"
    print(read_data(exc_path, "cart"))
相关推荐
databook11 小时前
Manim实现闪光轨迹特效
后端·python·动效
Juchecar12 小时前
解惑:NumPy 中 ndarray.ndim 到底是什么?
python
用户83562907805112 小时前
Python 删除 Excel 工作表中的空白行列
后端·python
Json_12 小时前
使用python-fastApi框架开发一个学校宿舍管理系统-前后端分离项目
后端·python·fastapi
数据智能老司机19 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机20 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机20 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机20 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i20 小时前
drf初步梳理
python·django
每日AI新事件20 小时前
python的异步函数
python