python自动化笔记(十一)——openpyxl之封装

2023-11-20

封装一个可以读取任意excel文件的方法,可以指定读取的表单,当我们多次从excel中读取数据时,就不用重复地写代码,只需调用封装的类即可。

一、封装的excel类实现的需求是什么?
1、读取表头数据
2、读取表头以外的所有数据。–返回值:列表,成员是每一行数据
3、因为每个方法都需要用到表单对象,从外部加载excel数据;所以要做初始化工作,加载一个excel,选中一个表单。
注意: 从excel里读取出来的数据只有两种类型,字符串和数字,后期可根据需要去进行处理

from openpyxl import load_workbook #导入加载函数

class Excel_data: #定义一个excel类
    def __init__(self,wb_name,sh_name):  #初始化工作,加载出一个表单对象,供函数使用
    	 """
        :param wb_name: 文件路径
        :param sh_name: 表单名字
        """
        self.wb = load_workbook(wb_name) #下面函数用到的属性才需要加self,如果下面函数没用到就不用加
        self.sh = self.wb[sh_name]

    def read_title(self):  #读取表头数据
        titles = [i.value for i in list(self.sh.rows)[0]]
        return titles

    def read_all_data(self):  # 读取表头以外的所有数据
        all_data = []
        for item in list(self.sh.rows)[1:]:
            value_list = [l.value for l in item]
            dic = dict(zip(self.read_title(),value_list))
            all_data.append(dic)
        return all_data

以上excel类封装完毕,下面调用看下

二、调用封装的excel类

import unittest  # 导入unittest框架
from unittestreport import ddt, list_data  # 导入ddt数据驱动

from python01.python04.register import register # 导入被测函数
from python01.python05.cyy1204 import Excel_data # 导入封装的excel类函数

datas = Excel_data("register__da.xlsx","Sheet1") #实例化excel类
all_data = datas.read_all_data()      # 调用类函数,得到所有数据

@ddt
class TestRegister(unittest.TestCase):
    @list_data(all_data)
    def test_register(self, case):
        result = register(**eval(case["params"])) #因为读取出来的是字符串,所以需要用eval函数去掉值的双引号
        self.assertEqual(result,eval(case["check"]))  

这样就完成excel类的调用,并且,把数据传递到测试用例当中

三、封装往Excel回写数据的方法

3.1 若需要往Excel里回写数据,则封装多一个回写的方法

from openpyxl import load_workbook


class ResdExcel:
    def __init__(self, wb_name, sh_name):
        """

        :param wb_name: 文件路径
        :param sh_name: 表单名称
        """
        self.wb = load_workbook(wb_name)  # 工作薄对象
        self.sh = self.wb[sh_name]  # 表单对象
        self.wb_name = wb_name

    def all_data(self):
        """取Excel表单所有数据"""
        all_datas = []
        #获取表头数据
        titles = [i.value for i in list(self.sh.rows)[0]]
        # 获取所有数据
        for item in list(self.sh.rows)[1:]:
            value_list = [i.value for i in item]
            dic = dict(zip(titles, value_list))
            all_datas.append(dic)
        return all_datas

    def write_data(self, row, column, value):
        """
        数据写入的方法
        :param row: 写入的行
        :param column: 写入的列
        :param value: 写入的值
        :return:
        """
        # 写入数据
        self.sh.cell(row, column, value)
        # 保存数据
        self.wb.save(self.wb_name)

3.2 调用封装的excel类,并执行回写方法

import unittest
from unittestreport import ddt, list_data

from python01.python04.register import register  # 导入被测函数
from python01.python1205.Excel_Kind import ResdExcel  # 导入封装好的excel类

excel = ResdExcel("register__da.xlsx", "Sheet1")  # 实例化excel类
all_data = excel.all_data()  # 调用读取全部数据方法


@ddt
class TestRegister(unittest.TestCase):
    @list_data(all_data)
    def test_register(self, case):
        # 第一步:准备测试数据
        params = eval(case["params"])
        expected = eval(case["check"])
        # 第二步:调功能函数,获取实际结果
        res = register(**params)
        # 第三步:断言
        try:
            self.assertEqual(res, expected)
        except AssertionError as e:
            # 把测试结果写回到Excel
            excel.write_data(case["case_id"] + 1, 5, "不通过")
            # 为了让unittest识别是条失败的用例,捕获异常进行处理后,要主动把异常抛出
            raise e
        else:
            # 把测试结果写回到Excel
            excel.write_data(case["case_id"] + 1, 5, "通过")

在这里插入图片描述
四、优化代码管理
若一个用例文件有几个或者几十个用例类时,可以把从excel中获取数据的代码放到类当中,设置成类属性,方便管理。

import unittest
from unittestreport import ddt, list_data

from python01.python04.register import register  # 导入被测函数
from python01.python1205.Excel_Kind import ResdExcel  # 导入封装好的excel类


@ddt
class TestRegister(unittest.TestCase):
    #把从excel中获取数据的代码放到类当中,设置成类属性,方便管理,因为这两行代码就是为这类服务的。
    excel = ResdExcel("register__da.xlsx", "Sheet1")  # 实例化excel类
    all_data = excel.all_data()  # 调用读取全部数据方法

    @list_data(all_data)
    def test_register(self, case):
        # 第一步:准备测试数据
        params = eval(case["params"])
        expected = eval(case["check"])
        # 第二步:调功能函数,获取实际结果
        res = register(**params)
        # 第三步:断言
        try:
            self.assertEqual(res, expected)
        except AssertionError as e:
            # 把测试结果写回到Excel
            self.excel.write_data(case["case_id"] + 1, 5, "不通过")
            # 为了让unittest识别是条失败的用例,捕获异常进行处理后,要主动把异常抛出
            raise e
        else:
            # 把测试结果写回到Excel
            self.excel.write_data(case["case_id"] + 1, 5, "通过")


@ddt
class Test02(unittest.TestCase):
    # 把从excel中获取数据的代码放到类当中,设置成类属性,方便管理,因为这两行代码就是为这类服务的。
    excel = ResdExcel("文件路径", "表单名")  # 实例化excel类
    all_data2 = excel.all_data()  # 调用读取全部数据方法

    @list_data(all_data2)
    def test_02(self):
        pass

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python自动化笔记(十一)——openpyxl之封装 的相关文章

  • Tensorflow 导入错误:没有名为“tensorflow”的模块

    我在 Windows Python 3 5 Anaconda 环境中安装了 TensorFlow 验证成功 有警告 tensorflow C gt python Python 3 5 3 英特尔公司 默认 2017 年 4 月 27 日 1
  • 当参数为 0 与任何其他整数时,如何为返回不同类型的函数创建重载注释?

    是否可以为当参数为时返回不同类型的函数创建重载注释0与任何其他整数 def foo val int gt MyObjectA MyObjectB if val 0 return MyObjectA return MyObjectB 有没有办
  • OpenPyXL - 如何查询单元格边框?

    python 和 openpyxl 都是新的 编写一个 py 脚本来遍历大量 Excel 工作簿 工作表 并且需要找到由边框格式标识的某些单元格 我在网上看到几个关于如何设置单元格边框的示例 但我需要阅读它们 具体来说 当表内的数据不一致但
  • 会话cookie太大烧瓶应用程序[重复]

    这个问题在这里已经有答案了 我正在尝试使用会话 本地 加载某些数据 并且它已经工作了一段时间 但是现在我收到以下警告 并且不再加载通过会话加载的数据 b session cookie 太大 该值是 13083 字节 但是 标头需要 44 个
  • 如何获取一个类的所有实例

    我是一名初学者 正在学习 Python 我想创建一个课程Person 在构造函数中 我想将我创建的每个实例放入一个名为 实例 的集合中 然后我希望实例 方法返回所有实例 我怎样才能做到这一点 class Person Type annota
  • 使用 Python 将 Json 转换为换行 Json 标准

    我有一个获取嵌套对象并删除所有嵌套的代码 使对象平坦 def flatten json y param y Unflated Json return Flated Json out def flatten x name if type x
  • 如何在Python中使用内联正则表达式修饰符[重复]

    这个问题在这里已经有答案了 我有一个正则表达式 n DOCUMENTATION n n n 2 s 女巫我正在尝试处理这样的一些文件 usr bin python coding utf 8
  • Python 结构的 PHP 替代品

    我很高兴在我的 Python 项目中使用 Fabric 进行部署 现在我正在从事一个更大的 PHP 项目 想知道是否有类似 PHP 的 Fabric 之类的东西 唔 为什么这有关系 Fabric 只是 python 脚本 所以它与项目语言无
  • 如何从张量流数据集迭代器返回同一批次两次?

    我正在转换一些旧代码以使用数据集 API 此代码使用feed dict将一批数据送入列车运行 实际上是三次 然后重新计算损失以供显示使用同一批 所以我需要一个迭代器来返回完全相同的批次两次 或多次 不幸的是 我似乎找不到一种使用张量流数据集
  • 调度算法,找到设定长度的所有非重叠区间

    我需要为我的管理应用程序实现一种算法 该算法将告诉我何时可以将任务分配给哪个用户 我实现了一个蛮力解决方案 它似乎有效 但我想知道是否有更有效的方法来做到这一点 为了简单起见 我重写了算法以对数字列表进行操作 而不是数据库查询等 下面我将尝
  • python 从字典中获取唯一值

    我想从我的字典中获取唯一的值 Input 320 167 316 0 319 167 401 167 319 168 380 167 265 166 期望的输出 167 0 168 166 我的代码 unique values sorted
  • 在 Django 中使用 path() 找不到 404

    我刚刚查看 django 并尝试通过视图列出书籍id作为 URL 的参数books urls py 但出现 404 页面未找到错误 当我在浏览器中输入此网址时 我没有发现网址有什么问题 http 192 168 0 106 8000 boo
  • 为什么使用 LAMP 托管时避免使用 CGI for Python?

    我已经使用 PHP 多年了 最近我在论坛上看到很多帖子说PHP 已经过时了 现代编程语言更简单 更安全等等 所以 我决定开始学习Python 由于我习惯使用 PHP 因此我刚刚开始通过上传 htaccess 文件来构建页面 addtype
  • 在 pandas DataFrame 中使用比较列表的问题

    我在 pandas 中有一个 DataFrame 其列类型之一是 int 上的列表 如下所示 df pandas DataFrame 1 2 3 4 5 6 7 8 9 10 columns a b c d gt gt gt df a b
  • 如何使用 NLP 确定句子中的中心词?

    例如 如果我得到一个句子 一名英国士兵在阿富汗战斗中丧生 这句话的中心词是 杀 给定 Python 中的 nltk 包 我怎样才能找到它 我不是在谈论词干 我指的是中心词 您正在寻找中心词句子解析 它可以在 Python 的 nltk 包中
  • 删除aws beanstalk上的uuid python包

    这是针对所提出问题的后续帖子 问题here https stackoverflow com questions 44421761 flask beanstalk deployment errors 以防万一对其他人有用 自从第一篇文章以来
  • Pandas 数据透视表同时包含多列

    我怀疑是否pandas pivot table可以一次接受两列并单独处理它们 而不是分层处理 假设我有以下数据框 id date day val 101 11 1 1 1 2 1 101 11 1 2 2 2 2 101 11 1 3 3
  • Python 中的否定

    如果路径不存在 我尝试创建一个目录 但是 不 运算符不起作用 我不知道如何在 Python 中进行否定 正确的方法是什么 if os path exists usr share sounds blues proc subprocess Po
  • 检查一个数是否是完全平方数

    如何检查一个数是否是完全平方数 速度并不重要 目前 只是工作 See also Integer square root in python https stackoverflow com questions 15390807 依赖任何浮点计
  • 网站可以检测您何时将 Selenium 与 chromedriver 结合使用吗?

    我一直在使用 Chromedriver 测试 Selenium 我注意到有些页面可以检测到您正在使用 Selenium 即使根本没有自动化 即使我只是通过 Selenium 使用 Chrome 手动浏览 Xephyr https en wi

随机推荐

  • neo4j windows图像界面 如何查询最短路径

    MATCH p1 concept name factor p2 concept name cf4 p allshortestpaths p1 10 p2 RETURN p 注意上述p1是变量这个是通用的 只需要更改concept这个即可 你
  • 使用Notepad++工具查看文件的十六进制

    最近在用notepad 打开 dat文件 想看看里面的一些数据但是打开之后发现是乱码 下面给出解决方法 1 首先打开 dat文件 发现是一些乱码 2 点击 插件 gt 搜索hex gt 找到HEX Editor勾选 gt 安装 3 重新打开
  • stm32对flash的读写保护与解除

    一 STM32对内部Flash的保护措施 所有STM32的芯片都提供对Flash的保护 防止对Flash的非法访问 写保护和读保护 1 读保护即大家通常说的 加密 是作用于整个Flash存储区域 一旦设置了Flash的读保护 内置的Flas
  • Nginx跨域配置

    一 跨域概述 1 1 同源策略 同源策略是一个安全策略 同源 指的是协议 域名 端口相同 浏览器处于安全方面的考虑 只允许本域名下的接口交互 不同源的客户端脚本 在没有明确授权的情况下 不能读写对方的资源 同源策略主要是基于如下可能的安全隐
  • 解决labelImg闪退问题

    问题 打开labelImg按下键盘任意键闪退 解决办法 降低python版本 博主将python版本从3 10降低至3 8 并且重新安装了pyqt5 sip和lxml两个包即可正常使用labelImg
  • 03LinuxC线程学习之线程共享和非共享

    1 线程共享和非共享 1 1 线程共享资源 1 文件描述符表 由于线程间共享进程间的内容 而文件描述符表在主线程的PCB当中 各个线程可以直接去请求访问 所以线程间通信就不需要像进程那样通过管道这些方式通信 2 每种信号的处理方式 即当某个
  • js解决浏览器,SpeechSynthesis不能正常合成中文语音

    工作中遇到 浏览器不能合成语音 解决思路 合成失败时 循环合成列表 找到能正常合成的为止 对于一直不能合成的浏览器 设置开关 关闭循环功能
  • 服务器系统安装蓝牙驱动,安装蓝牙设备 - Windows drivers

    安装蓝牙设备 05 29 2020 本文内容 重要 本主题面向程序员 如果你是遇到蓝牙设备安装问题的客户 请参阅 在 Windows 中配对蓝牙设备 蓝牙配置文件驱动程序有两种安装类型 远程设备的 客户端安装 远程设备在该远程设备上公布其服
  • vc6.0 c语言加油站,第2章 C语言初探:4、在VC6.0下运行C语言程序

    不管你是否决定使用C Free 都建议阅读 在C Free下运行C语言程序 文中讲到了几个重要概念 对初学者大有裨益 Visual C 6 0简称VC或者 VC6 0 确实有点老了 在XP Win7下都可能会存在兼容性问题 在Win8下根本
  • 图解GitHub和SourceTree入门教程

    http blog csdn net collonn article details 39259227
  • 想去游戏公司做游戏,最重要的是什么素养?

    首先 要学会沟通 话说 动过去游戏公司的念头 做游戏 感觉很酷 但是 想想自己一不会编程 二不会画画 做策划 那好像是两边受气里外不是人出事第一个背锅的角色 想想也就想想 不过正好前些天我们发过一篇讲去日本学游戏的文章 说不定能派上用场 前
  • 华为OD机试真题- 学校的位置【2023Q1】【JAVA、Python、C++】

    题目描述 为了解决新学期学生暴涨的问题 小乐村要建所新学校 考虑到学生上学安全问题 需要所有学生家到学校距离最短 假设学校和所有的学生家 走在一条直线上 请问 学校要建在什么位置 能使得学校到各个学生家的距离之和最短 输入描述 输入的第一行
  • sql语句中的空值(null)

    含null值的表达式都为null null null 在判断某个数是否为null的时候不是用等号来表示 而是用 is null 在过滤的时候 可以使用in null 但是使用not in null的时候会报错 因为in函数 是指满足里面的情
  • java入门的第一个程序代码 hello world

    很多人说 学Java真的很难 其实 这是真的 但是高薪之所以为高薪 就是因为它比普通的活难的多 今天是我第一篇的博客 我还是想鼓励想学java技术的小伙伴一起来学 很多事只有去做了 你才能知道自己能不能成功 好了 接下来看Java入门的第一
  • 网易云音乐财报解读:收入大增亏损收窄,“云村”草长莺飞

    独家版权时代结束后 在线音乐产业进入了新的发展阶段 各家音乐平台经营状况备受关注 2月23日 网易云音乐公布了2022年全年财务业绩 财报显示 网易云音乐2022年全年收入为90亿元 较2021年同比增长28 5 值得一提的是 得益于盈利能
  • 数组的一些简单操作,列表改数组,数组合并,数组存取

    数组的简单操作 总用的一些操作 记录一下 要不总忘 1列表改数组 import numpy as np a 1 2 3 4 a np array a 输出a array 1 2 3 4 2数组合并 延竖轴拼接数组 aa np vstack
  • hive中取最大值最小值的函数

    max 和min 函数 select a max b from t group by a select a min b from t group by a max和min函数是取某一列中的最大或者最小值 greatest 和least 函数
  • R数据科学-第九章使用lubridate处理日期和时间

    本章将会使用以下三个包 gt library tidyverse gt library lubridate gt library nycflights13 一 创建日期或时间 表示日期或时间的数据有三种 日期 在tibble中显示为date
  • C#学习笔记 事件

    事件为委托提供了一种发布 订阅机制 声明事件的类被称为发行者类 其他类可以订阅发行者类中的事件 当发行者类触发其中的事件时 所有订阅该事件的类都会收到这个变化 在图形界面框架中 这种情况非常常见 事件发布者 首先需要创建一个事件发布者类 该
  • python自动化笔记(十一)——openpyxl之封装

    封装一个可以读取任意excel文件的方法 可以指定读取的表单 当我们多次从excel中读取数据时 就不用重复地写代码 只需调用封装的类即可 一 封装的excel类实现的需求是什么 1 读取表头数据 2 读取表头以外的所有数据 返回值 列表