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"))
相关推荐
在努力的韩小豪35 分钟前
如何从0开始构建自己的第一个AI应用?(Prompt工程、Agent自定义、Tuning)
人工智能·python·llm·prompt·agent·ai应用·mcp
Otaku love travel2 小时前
实施运维文档
运维·windows·python
测试老哥2 小时前
软件测试之单元测试
自动化测试·软件测试·python·测试工具·职场和发展·单元测试·测试用例
presenttttt3 小时前
用Python和OpenCV从零搭建一个完整的双目视觉系统(六 最终篇)
开发语言·python·opencv·计算机视觉
Channing Lewis3 小时前
excel如何只保留前几行
excel
测试19984 小时前
软件测试之压力测试总结
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·压力测试
李昊哲小课4 小时前
销售数据可视化分析项目
python·信息可视化·数据分析·matplotlib·数据可视化·seaborn
烛阴5 小时前
带参数的Python装饰器原来这么简单,5分钟彻底掌握!
前端·python
全干engineer5 小时前
Flask 入门教程:用 Python 快速搭建你的第一个 Web 应用
后端·python·flask·web
nightunderblackcat5 小时前
新手向:Python网络编程,搭建简易HTTP服务器
网络·python·http