【python】基于xlwt/xlrd和openpyxl库分别实现对Excel表格的读写功能

本文介绍使用Python的xlwt/xlrd与openpyxl库进行自动化测试结果写入Excel的方法,并对比两种库在不同CPU平台上的写入效率。

一、前言

  最近在工作项目中实现了接口的自动化测试脚本,使用的是Python+requests库,利用requests中的session对象,携带登录后的用户信息发送接口请求,再将接口的状态和返回报文等信息组装成测试结果,写入excel表格。
  因为涉及到的接口比较多,在把测试结果写入excel表格的时候,就得需要考虑写入的效率。通过网上的一番查询和线下的请教,利用xlwt/xlrdopenpyxl这两种第三方库,实现了对表格的数据写入操作代码,特记录总结在此;另一方面,也是为了日后再有需要,可直接使用对应的代码。

二、执行环境

  正好手里有两台不同CPU的电脑,索性就在两台电脑上都跑一遍,在同平台下比较第三方库之间的代码执行效率。

配置项笔记本台式机
系统Windows10Windows10
CPUR7-4800U 8核16线程i5-8400 6核6线程
内存16G16G
主硬盘512G三星SSD256G三星SSD

三、参考代码

3.1 xlwt/xlrd库

# -*- coding: UTF-8 -*-
"""=================================================
@Author :Fantasy_Boyce
@Date   :2020/9/14 21:33
@Desc   :Excel表格处理类
=================================================="""
import xlwt
import xlrd
import os
import time
from xlutils.copy import copy

var code = "064695cf-dce8-4008-8748-4ce45b4e3322"

class ExcelHandle:
    def __init__(self):
        # 初始化保存的路径和文件名,此处以当前时间命名,如有其他需求,可自行更改
        filename = '{}.csv'.format(time.strftime('%Y%m%d%H%M%S'))
        self.path = os.path.join(os.getcwd(), filename)
        
        # 初始化表格的表头字段
        self.__init_title = ['序号', '时间', 'URL地址', '第一个数', '第二个数', '公式', '备注']
        
        self.__init_templates()
    
    def __init_templates(self):
        # 初始化文件,生成一个仅含有表头的表格
        try:
            if os.path.exists(self.path):
                os.remove(self.path)
                self.__init_templates()
            else:
                # 新建一个工作表对象
                workbook = xlwt.Workbook(self.path)
                
                # 创建sheet页
                sheet = workbook.add_sheet('测试数据页')
                
                # 循环之前定义的表头,从第1行第1列开始,依次写入数据
                for i in range(len(self.__init_title)):
                    sheet.write(0, i, self.__init_title[i])
                
                workbook.save(self.path)
        except Exception as e:
            print(e)
    
    def write_content(self, content):
        try:
            # 打开表格
            workbook = xlrd.open_workbook(self.path)
            # 获取表格中所有的sheets页,列表类型
            sheets_list = workbook.sheet_names()
            
            # 获取第1张sheet页,序号从0开始,即最左边的sheet页。
            worksheet = workbook.sheet_by_name(sheets_list[0])
            
            # 获取当前sheet页中已有数据的行数
            row_old = worksheet.nrows
            
            new_workbook = copy(workbook)
            new_worksheet = new_workbook.get_sheet(0)
            
            # 遍历传入的content内容,写入表格中
            for j in range(len(self.__init_title)):
                new_worksheet.write(row_old, j, content[j])
            
            new_workbook.save(self.path)
        except Exception as e:
            print(e)

3.2 openpyxl库

# -*- coding: UTF-8 -*-
"""=================================================
@Author :Fantasy_Boyce
@Date   :2020/9/14 22:11
@Desc   :
=================================================="""
import os
import time
import openpyxl


class ExcelHandle:
    def __init__(self):
        # 初始化保存的路径和文件名,此处以当前时间命名,如有其他需求,可自行更改
        filename = '{}.xlsx'.format(time.strftime('%Y%m%d%H%M%S'))
        self.path = os.path.join(os.getcwd(), filename)
        
        # 初始化表格的表头字段
        self.__init_title = ['序号', '时间', 'URL地址', '第一个数', '第二个数', '公式', '备注']
        
        self.__init_templates()
    
    def __init_templates(self):
        # 初始化文件,生成一个仅含有表头的表格
        try:
            if os.path.exists(self.path):
                os.remove(self.path)
                self.__init_templates()
            else:
                # 新建一个工作表对象
                workbook = openpyxl.Workbook()
                
                # 激活并重命名sheet页
                sheet = workbook.active
                sheet.title = '测试数据页'
                
                # 循环之前定义的表头,从第1行第1列开始,依次写入数据
                for i in range(len(self.__init_title)):
                    sheet.cell(row=1, column=i + 1, value=self.__init_title[i])
                
                workbook.save(self.path)
        except Exception as e:
            print(e)
    
    def write_content(self, content):
        # 加载excel
        workbook = openpyxl.load_workbook(self.path)
        # 切换到指定的sheet页
        sheet = workbook['测试数据页']
        # 将content追加至sheet页中
        sheet.apeed(content)
        # 保存工作表
        workbook.save(self.path)

四、测试数据

  在项目测试的时候,涉及到的接口汇总约有5000来个。因为在家环境,无法构造如此庞大的真实接口数据,所以模拟生成了一组数据作为接口的测试结果,写入到excel表格,数据量也由5000个降低为3000个。除此之外,单条测试数据涉及到的字段也有所修改。
  测试数据的生成代码如下。
测试数据生成代码

五、表格写入效果

在这里插入图片描述

六、测试结果

6.1 写入速率总体统计

  由下图可看出:

  1. 在同一个CPU平台中,随着数据量的提升,单条数据写入耗时也随之增加。当数据量超过1000条时,openpyxl库的耗时速率明显比xlwt库增长的更快。
  2. 在同一个CPU平台中,针对前N条数据写入平均耗时和总耗时,xlwt库低于openpyxl库,xlwt库的写入速率大约是openpyxl库的2.5~3倍左右。
  3. 同一个第三方库在不同的CPU平台上,增长趋势几乎一致。

  另外,鉴于手里两台电脑的CPU性能不在同一水平上(R7-4800U性能得分842,i5-8400性能得分601),不同库在平台之间的写入速率不做深入对比。

数据来源:
桌面CPU性能排行榜,网页数据更新时间:2020-07-22
笔记本CPU性能排行榜,网页数据更新时间:2020-05-25

在这里插入图片描述

6.2 AMD平台写入速率统计

  1. xlwt/xlrd库,单次写入最高耗时:242毫秒。
    在这里插入图片描述

  2. openpyxl库,单次写入最高耗时:549毫秒。
    在这里插入图片描述

6.3 Inter平台写入速率统计

  1. xlwt/xlrd库,单次写入最高耗时:231毫秒。
    在这里插入图片描述
  2. openpyxl库,单次写入最高耗时:629毫秒。
    在这里插入图片描述
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值