Python 接口测试之Excel表格数据操作方法封装

news2024/12/24 8:58:04

引言

我们在做接口测试,经常会用到excel去管理测试数据,对Excel的操作比较频繁,那么使用python如何操作Excel文件的读与写呢?由于之前讲的都是大的框框,没有讲这么小的模块使用,现在就化整为0的讲解。

读写模块介绍

python有三个模块是对Excel文件的操作,分别是:openpyxl,xlrd和xlwt。下面简单的介绍一下各个模块的特点及使用案例。

如果你想学习自动化测试,我这边给你推荐一套视频,这个视频可以说是B站播放全网第一的接口测试教程,同时在线人数到达1000人,并且还有笔记可以领取及各路大神技术交流:798478386 

B站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)_哔哩哔哩_bilibiliB站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)共计200条视频,包括:1、接口自动化之为什么要做接口自动化、2、接口自动化之request全局观、3、接口自动化之接口实战等,UP主更多精彩视频,请关注UP账号。https://www.bilibili.com/video/BV17p4y1B77x/?spm_id_from=333.337.search-card.all.click

xlrd

xlrd是用来从Excel中读写数据的,但我平常只用它进行读操作,写操作会遇到些问题。用xlrd进行读取比较方便,流程和平常手动操作Excel一样,打开工作簿(Workbook),选择工作表(sheets),然后操作单元格(cell)。下面举个例子,例如要打开当前目录下名为”data.xlsx”的Excel文件,选择第一张工作表,然后读取第一行的全部内容并打印出来。Python代码如下:

import os
import xlrd
from xlutils.copy import copy
 
# 获取当前文件的绝对路径
curPath = os.path.abspath(os.path.dirname(__file__))
print(curPath)
# 获取项目根目录
rootPath = os.path.abspath(os.path.dirname(curPath))
print(rootPath)
 
# 获取文件路径
file_path = r'APItest_ddt\data\data.xls'
file_path = os.path.join(rootPath,file_path)
print(file_path)
#打开excel文件
data=xlrd.open_workbook(file_path)
#获取第一张工作表(通过索引的方式)
table=data.sheets()[0]
#data_list用来存放数据
data_list=[]
#将table中第一行的数据读取并添加到data_list中
data_list.extend(table.row_values(0))
#打印出第一行的全部数据
for item in data_list:
    print(item)
 
 
# 写入数据
copy_data = copy(data)
# 读取复制的excel的sheet页
copy_data_to_sheet = copy_data.get_sheet(0)
# 通过get_sheet()获取的sheet有write()方法,写入数据
copy_data_to_sheet.write(5,5,"这是我写入的测试数据:哈哈")
# 保存数据
copy_data.save(file_path)

运行结果:

C:\Users\Administrator\Desktop\APItest_ddt
C:\Users\Administrator\Desktop
C:\Users\Administrator\Desktop\APItest_ddt/data/data.xls
地址

打开data.xls文件:

在处理excel数据时发现了xlwt的局限性–不能写入超过65535行、256列的数据(因为它只支持Excel 2003及之前的版本,在这些版本的Excel中行数和列数有此限制),这对于实际应用还是不够的。为此经过一番寻找发现了一个支持07/10/13版本Excel的openpyxl,虽然功能很强大,但是操作起来感觉没有xlwt方便。以上是xlrd的几个简单操作,并且可以发现,xlrd可以读,也可以写的。只是写的话,没那么方便。

xlwt

如果说xlrd不是一个单纯的Reader(如果把xlrd中的后两个字符看成Reader,那么xlwt后两个字符类似看成Writer),那么xlwt就是一个纯粹的Writer了,因为它只能对Excel进行写操作。xlwt和xlrd不光名字像,连很多函数和操作格式也是完全相同。下面简要归纳一下常用操作。

import xlwt
# 新建一个Excel文件(只能通过新建写入)
data=xlwt.Workbook()
# 新建一个工作表
table=data.add_sheet('name')
# 写入数据到A1单元格
table.write(0,0,u'呵呵')
# 注意:如果对同一个单元格重复操作,会引发overwrite Exception,想要取消该功能,需要在添加工作表时指定为可覆盖,像下面这样
table=data.add_sheet('sheet1',cell_overwrite_ok=True)
# 保存
data.save('test.xls')

查看结果:

openpyxl

该模块支持最新版的Excel文件格式,对Excel文件具有响应的读写操作,对此有专门的Reader和Writer两个类,便于对Excel文件的操作。虽然如此,但我一般还是用默认的workbook来进行操作。常用操作归纳如下:

from openpyxl.reader.excel import load_workbook
 
wb=load_workbook(filename=r"openpyxl_test.xlsx")
 
import openpyxl
 
if __name__ == '__main__':
 
    wb = load_workbook(filename=r"openpyxl_test.xlsx")
    # 显示所有工作表的名字
    sheet_name = wb.get_sheet_names()
    print(sheet_name)
    # 取第一张表
    sheetnames = wb.sheetnames
    ws = wb[sheetnames[0]]
    # 显示表名,表行数,表列数
    print("Work Sheet Title:", ws.title)
    print("Work Sheet Rows:", ws.max_row)
    print("Work Sheet Cols:", ws.max_column)
    # 获取指定行的值,如第三行
    row3_values = []
    row3_cell_list = list(ws.rows)[2]
    for cell in row3_cell_list:
        row3_values.append(cell.value)
    print(row3_values)  # output:['A3', 'B3', 'C3', 'D3']
 
    # 获取所有行的数据
    # 建立存储数据的字典
    data = {}
    # 获取表格所有值
    # 法1:
    for i in range(0, ws.max_row):
        every_row_values = []
        every_row_cell_list = list(ws.rows)[i]
        for cell in every_row_cell_list:
            every_row_values.append(cell.value)
        data[i + 1] = every_row_values
    print(data)
    # {1: ['A1', 'B1', 'C1', 'D1'], 2: ['A2', 'B2', 'C2', 'D2'], 3: ['A3', 'B3', 'C3', 'D3'], 4: ['A4', 'B4', 'C4', 'D4'], 5: ['A5', 'B5', 'C5', 'D5'],
    #  6: ['A6', 'B6', 'C6', 'D6'], 7: ['A7', 'B7', 'C7', 'D7'], 8: ['A8', 'B8', 'C8', 'D8'], 9: ['A9', 'B9', 'C9', 'D9'], 10: ['A10', 'B10', 'C10', 'D10'],
    # 11: ['A11', 'B11', 'C11', 'D11']}
    # 法2
    for row in ws.rows:
        line = [cell.value for cell in row]
    print(
        line)  # output:['A1', 'B1', 'C1', 'D1'],['A2', 'B2', 'C2', 'D2'], ['A3', 'B3', 'C3', 'D3'],['A4', 'B4', 'C4', 'D4'], ['A5', 'B5', 'C5', 'D5'],['A6', 'B6', 'C6', 'D6'],['A7', 'B7', 'C7', 'D7'],['A8', 'B8', 'C8', 'D8'],['A9', 'B9', 'C9', 'D9'],['A10', 'B10', 'C10', 'D10'],['A11', 'B11', 'C11', 'D11']
    # 获取某个区间的值,例:获得了以A3为左上角,C6为右下角矩形区域的所有单元格
    # 法1:使用range
    data1 = {}
    for i in range(2, 6):
        every_row_values = []
        every_row_cell_list = list(ws.rows)[i]
        for cell in every_row_cell_list:
            every_row_values.append(cell.value)
        data1[i + 1] = every_row_values
    print(data1)
    # output{3: ['A3', 'B3', 'C3', 'D3'], 4: ['A4', 'B4', 'C4', 'D4'], 5: ['A5', 'B5', 'C5', 'D5'], 6: ['A6', 'B6', 'C6', 'D6']}
 
    # 法2:使用切片
    data_list = []
    for row_cell in ws['A3':'C6']:
        every_row_value = []
        for cell in row_cell:
            every_row_value.append(cell.value)
        data_list.append(every_row_value)
    print(data_list)  # output:[['A3', 'B3', 'C3'], ['A4', 'B4', 'C4'], ['A5', 'B5', 'C5'], ['A6', 'B6', 'C6']]
 
 
 
 
 
    # 测试写入数据:
 
    wb = load_workbook(filename=r"openpyxl_test.xlsx")
    ws = wb.active
 
    # 第一个sheet是ws
    ws = wb.worksheets[0]
 
    # 设置ws的名称
    ws.title = "range names"
 
    # 向某个单元格中写入数据
    ws.cell(11,11).value = u'Test write data!!!'
 
    # 最后保存文件
    wb.save(filename=r"openpyxl_test.xlsx")

结果如下:

封装读写

上面已经介绍了三个模块的使用,那么在搭建接口测试框架的时候,不可能这样写,一方面不利于代码可读性与维护,另一方面不雅观。所以,要对零散的代码进行二次封装,一下就是针对常用方法进行二次封装:

import xlrd
from xlutils.copy import copy
import os
# 获取当前文件的绝对路径
curPath = os.path.abspath(os.path.dirname(__file__))
print(curPath)
# 获取项目根目录
rootPath = os.path.abspath(os.path.dirname(curPath))
print(rootPath)
 
# 类中使用装饰器 @classmethod定义方法,是类方法
# 类中使用装饰器 @staticmethod定义方法,是静态方法
 
 
class Operate_Excel(object):
    """
    操作excel类
 
    """
    # 定义构造函数,创建对象自动执行
    def __init__(self,file_path=None,sheet_id=None):
        """
 
        :param file_path:如果没传值,默认为excel路径
        :param sheet_id:如果没传值,默认为第一个sheet页
        """
        if file_path:
            # 成员变量
            self.file_path = file_path
            self.sheet_id = sheet_id
        else:
            self.file_path = r'data/util_data/operate_excel.xls'
            # 将文件目录拼接成绝对路径
            self.file_path = os.path.join(rootPath,self.file_path)
            print(self.file_path)
 
        if sheet_id:
            self.sheet_id = sheet_id
        else:
            self.sheet_id = 0
        # 调用成员方法
        self.sheet_table = self.get_sheet()
 
    """成员方法"""
    # 获取sheet页操作对象
    def get_sheet(self):
        data = xlrd.open_workbook(self.file_path)
        sheet_table = data.sheets()[self.sheet_id]
        return sheet_table
 
    # 获取sheet页的行数和列数,返回的是一个元组
    def get_sheet_nrows_ncols(self):
        return self.sheet_table.nrows,self.sheet_table.ncols
 
    # 获取sheet页的行数
    def get_sheet_nrows(self):
        return self.sheet_table.nrows
 
    # 获取sheet页的列数
    def get_sheet_ncols(self):
        return self.sheet_table.ncols
 
    # 获取具体单元格的数据
    def get_sheet_cell(self,row,col):
        """
        :params row: 单元格行值
        :params col: 单元格列值
        :return: cell_data
        """
        cell_data = self.sheet_table.cell_value(row,col)
        return cell_data
 
    # 写入数据到excel中
    def write_to_excel(self,row,col,values):
        # 打开excel文件读取数据句柄
        data = xlrd.open_workbook(self.file_path)
        # 复制excel
        copy_data = copy(data)
        # 读取复制的excel的sheet页
        copy_data_to_sheet = copy_data.get_sheet(0)
        # 通过get_sheet()获取的sheet有write()方法,写入数据
        copy_data_to_sheet.write(row,col,values)
        # 保存数据
        copy_data.save(self.file_path)
 
if __name__ == '__main__':
    read_xls = Operate_Excel()
    print("获取excel表的行数与列数,返回元组格式: ",read_xls.get_sheet_nrows_ncols())
    print("获取excel表的行数: ",read_xls.get_sheet_nrows())
    print("获取excel表的列数: ",read_xls.get_sheet_ncols())
    print("获取excel表的单元格(1,1)的值: ",read_xls.get_sheet_cell(1,1))
    print("获取excel表的单元格(1,2)的值: ",read_xls.get_sheet_cell(1,2))
    print("获取excel表的单元格(2,2)的值: ",read_xls.get_sheet_cell(2,2))
    print("写入excel表的单元格(2,2)的值: ",read_xls.write_to_excel(8,8,'test'))

运行结果:

获取excel表的行数与列数,返回元组格式:  (18, 9)
获取excel表的行数:  18
获取excel表的列数:  9
获取excel表的单元格(1,1)的值:  case_name01
获取excel表的单元格(1,2)的值:  case_method01
获取excel表的单元格(2,2)的值:  case_method02
写入excel表的单元格(2,2)的值:  None

excel文件:

总结

到此,Excel读写功能已经介绍完,以上功能大部分满足日常使用,当然你也可以深入研究,继续加入其它方法进来。以上源码,已上传到群文件中,可以加入QQ测试开发交流群:798478386 索取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/638687.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

黑客工具软件大全

黑客工具软件大全100套 给大家准备了全套网络安全梓料,有web安全,还有渗透测试等等内容,还包含电子书、面试题、pdf文档、视频以及相关的网络安全笔记 👇👇👇 《黑客&网络安全入门&进阶学习包》 &a…

深度学习笔记之Seq2seq(三)注意力机制的执行过程

深度学习笔记之Seq2seq——注意力机制的执行过程 引言回顾:经典 Seq2seq \text{Seq2seq} Seq2seq模型中 Context \text{Context} Context向量的缺陷注意力机制的动机 Seq2seq \text{Seq2seq} Seq2seq中的 Attention \text{Attention} Attention结构注意力模型的数学…

chatgpt赋能python:Python如何合并集合?

Python如何合并集合? 在Python编程中,合并多个集合是一项常见的任务。集合合并在数据处理和分析领域中极为常见,例如在合并用户数据时,需要将多个相同字段的集合合并为一个完整的集合。 本文将介绍如何在Python中合并集合&#…

【语音之家】AI产业沙龙 —— 解读火山语音团队在国际顶会ACL2023的创新突破

由CCF语音对话与听觉专委会 、中国人工智能产业发展联盟(AIIA)评估组、火山语音、语音之家、希尔贝壳共同主办的【语音之家】AI产业沙龙——解读火山语音团队在国际顶会ACL2023的创新突破,将于2023年6月14日19:00-20:20线上直播。 沙龙简介 …

JVM中方法区、永久代、元空间详解以及关系?

首先我们需要先复习一下jvm的大致内存图,如下: 哦~ ,想起来了,原来方法区属于jvm的运行时数据区,且作用就是存储类信息、方法信息、常量池信息等静态数据。 (补充一下:运行时数据区中的红色是指…

​跨部门网络搭建,核心在这30行里

大家好,我的网工朋友。 在企业网络中,想要实现跨部门的VLAN互联互通,其实有很多方式。 你可以通过子接口实现,也可以通过VLAN-Interface实现。但在实际工作中,很多网工朋友,遇到这种情况,很容…

【Selenium2+python】自动化unittest生成测试报告

前言 批量执行完用例后,生成的测试报告是文本形式的,不够直观,为了更好的展示测试报告,最好是生成HTML格式的。 unittest里面是不能生成html格式报告的,需要导入一个第三方的模块:HTMLTestRunner 一、导…

java小技能: 使用response方式下载txt文件(使用response的方式进行文件的传输)

文章目录 引言I 后端代码1.1 思路1.2 封装1.3 用法1.4 防止文件名称中文乱码1.5 指示哪些报头可以公开 Access-Control-Expose-Headers1.6 创建目录II 前端下载文件引言 项目需求:进行txt文件的下载 其他思路:写好文件在下载的方式 本文思路:使用response的方式进行文件的传…

【实战】minigpt4的体验和微调

MiniGPT-4 https://github.com/vision-cair/minigpt-4 1 环境配置 1.1 安装环境 git lfs install //如果报错 :git: lfs is not a git command. See git --help. //尝试使用: sudo apt-get install git-lfs git lfs install1.2 准备Vicuna权重 &…

树的概念和性质

文章目录 树的基本概念树的定义和术语树的遍历树的种类 二叉树二叉搜索树AVL 树红黑树 完全二叉树和满二叉树哈夫曼树 多叉树B 树及其变种B 树B 树和 B* 树 目录 树的基本概念 树的定义和术语 树是由零个或多个结点组成的具有层级关系的数据结构。 当树的结点数量等于零时&a…

暴力递归到动态规划(四)

⭐️前言⭐️ 本篇文章是从暴力递归到动态规划篇目的最后一篇文章,包含了几道题目还有最终的大总结,相信这篇文章能让各位读者对动态规划有更深一步的了解。 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟&#x1f601…

使用大型语言模(LLM)构建系统(五):输出结果检查

今天我学习了DeepLearning.AI的 Building Systems with LLM 的在线课程,我想和大家一起分享一下该门课程的一些主要内容。今天我们来学习输出结果检查。输出结果检查包含以下两部分内容: 检查输出是否存在潜在有害内容检查输出是否基于提供的产品信息 下…

easyrecovery2023永久免费版激活密钥,手把手教您用EasyRecovery快速恢复数据

Ontrack EasyRecovery Crack Professional是一个全面的备份和恢复实用程序,可以从多个数据丢失事件中恢复文件,例如常见的意外删除、更严重的(有时是病毒引起的)分区或驱动器格式化,甚至硬盘严重损坏后的数据丢失。免费…

Python实现ACO蚁群优化算法优化LightGBM回归模型(LGBMRegressor算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蚁群优化算法(Ant Colony Optimization, ACO)是一种源于大自然生物世界的新的仿生进化算法&#xff0c…

全球计算科学和人工智能领域Altair

作为全球计算科学和人工智能领域的领导者 Altair,全新数据分析与人工智能平台 Altair RapidMiner。此次启动仪式以 “数据科学,解码智能未来” 为主题。目的是为了更好的助力本土用户推进高效数字化转型,实现数据分析与人工智能应用的降本增效. 作为全球…

PR视频导出时出现编译影片出错的提示怎么解决?

大家使用PR软件的时候因为版本不兼容等各种原因,导致剪辑好的视频导不出来(如下图所示),这种情况有两种方法可以解决。(我用的版本是2022Pro,电脑需要Win10的系统,如有需要下载的,可…

使用 Terraform 在 GCP 上一键部署 EMQX MQTT Broker

引言 MQTT 是一种轻量级的消息传递协议,适用于物联网应用实现设备间通信。 作为一款主流的开源 MQTT Broker,EMQX 能够提供高扩展性、可靠性和安全性的 MQTT 消息传递服务。 借助广泛应用的基础设施即代码(IaC)工具 Terraform&a…

外包干了4年,人直接废了···

有一说一,外包没有给很高的薪资,是真不能干呀! 先说一下自己的情况,大专生,19年通过校招进入湖南某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了&#xff0…

【javaScript】Proxy与Object.defineProperty的区别

目录 功能方面的区别:Object.defineProperty对整个对象进行赋值,不会触发set拦截Object.defineProperty对整个对象进行遍历,不会触发get拦截Proxy自定义拦截行为 Proxy的优缺点优点:缺点 Proxy和Object.defineProperty都是JavaScr…

亿发软件:中医药信息一体化解决方案,智慧中药房煎配系统

智慧中药房是中医药服务的一种新模式,随着中医药信息化建设逐渐兴起,湖南远跃顺应时代发展需求,深度分析中医药行业现状,充分发挥研发技术创新,融合运用互联网、物联网、大数据等技术创新成果,研发出中药信…