一个使用xlwings操作excel数据优化60倍处理效率的案例
☞ ░ 前往老猿Python博文目录 ░
一、引言
老猿在将自己的博文数据(包括url地址、标题和阅读数量)从博客中获取后,使用xlwings保存到excel对象时发现,不同的处理方法性能相差非常大。
案例程序每次获取博文数据后,对新的博文将其信息保存到excel,对老的博文则将其数据更新,每次处理的阅读量单列一列,存储数据类似如下:

前面两列分别为url和标题,后面随着处理次数增多会有多列数据记录下访问时间及当时的博文阅读数量,涉及处理的博文有900多篇,阅读量数据有近10列。
二、案例背景说明
本案例中只以输出阅读量数据为例,阅读量位于第三列开始,保存在二维列表urlReadInfoList中,二维列表中的元素也是列表,每个列表保存一行数据的多列阅读量。在初始输出时,老猿使用如下语句:
def saveArticlesInfo():
......
logPag("将文章阅读数量填入excel对象中...")
line = 2 #第一行为标题,从第二行开始保存
for readinfo in urlReadInfoList:
sheet.range(line,3).value = readinfo #一次输出一行
line += 1
logPag("设置excel数据的宽度...")
上面是拷贝了saveArticlesInfo的部分代码,其中使用的函数logPag是将对应参数信息前加一个输出时刻的具体时间值之后再输出,以跟踪代码耗时。
针对这900多行10列的阅读量数据处理耗时近1分钟,具体输出信息如下:
20200704 211802: 将文章阅读数量填入excel对象中...
20200704 211858: 设置excel数据的宽度...
三、优化措施
为了提高效率,老猿将其采用以列为单位输出,为了保证前期代码不用修改,在此输出时做了个变换处理,将阅读量数据的行和列的维度交换了一下,下面是交换函数:
def exchangeLineColumn(array):
columncount = len(array[0])
rowcount = len(array)
columnData = []
for i in range(columncount):
columnData.append([])
for line in array:
columnPos = 0
for column in line:
columnData[columnPos].append(column)
columnPos += 1
return columnData
然后在输出前调用该交换函数,将交换后的数据以列为单位输出。代码如下:
logPag("将文章阅读数量填入excel对象中...")
# line = 2
# for readinfo in urlReadInfoList:
# sheet.range(line,3).value = readinfo
# line += 1
readInfoList= exchangeLineColumn(urlReadInfoList)
columnno = 3 #阅读量从第2行3列开始
for readinfo in readInfoList:
sheet.range(2,columnno).options(transpose=True).value = readinfo
columnno += 1
logPag("设置excel数据的宽度...")
最后看运行结果:
20200704 214611: 将文章阅读数量填入excel对象中...
20200704 214611: 设置excel数据的宽度...
以上输出结果可以看到,处理用时不到1秒,效率至少提高了60倍。
补充说明:
其实上面的方式还可以更好地解决办法,就是一次性写入多行多列:
logPag("将文章阅读数量填入excel对象中...")
sheet.range("C2").value = urlReadInfoList
# line = 2
# for readinfo in urlReadInfoList:
# sheet.range(line,3).value = readinfo
# line += 1
#readInfoList= exchangeLineColumn(urlReadInfoList)
#columnno = 3
#for readinfo in readInfoList:
# sheet.range(2,columnno).options(transpose=True).value = readinfo
# columnno += 1
logPag("设置excel数据的宽度...")
四、结论
使用xlwings操作excel时,对行和列的访问尽量避免单个单元数据访问,使用整行或整列数据操作时,最好是一次性尽可能操作多的数据,如果行列数据分布极度不均时这可以大幅提高效率。
具体操作方法请参考《Python学习随笔:使用xlwings设置和操作excel多行多列数据以及设置数据字体颜色填充色对齐方式的方法》。
跟老猿学Python、学5G!
☞ ░ 前往老猿Python博文目录 ░
一个使用xlwings操作excel数据优化60倍处理效率的案例的更多相关文章
- C#操作Excel数据增删改查(转)
C#操作Excel数据增删改查. 首先创建ExcelDB.xlsx文件,并添加两张工作表. 工作表1: UserInfo表,字段:UserId.UserName.Age.Address.CreateT ...
- C#操作Excel数据增删改查示例
Excel数据增删改查我们可以使用c#进行操作,首先创建ExcelDB.xlsx文件,并添加两张工作表,接下按照下面的操作步骤即可 C#操作Excel数据增删改查. 首先创建ExcelDB.xlsx文 ...
- python中操作excel数据 封装成一个类
本文用python中openpyxl库,封装成excel数据的读写方法 from openpyxl import load_workbook from openpyxl.worksheet.works ...
- C# 操作Excel数据透视表
一.概述 数据透视表(Pivot Table)是一种交互式的表,可以进行某些计算,如求和与计数等,可动态地改变透视表版面布置,也可以重新安排行号.列标和页字段.当改变版面布置时,数据透视表也会按照新的 ...
- python中操作excel数据
python操作excel,python有提供库 本文介绍openpyxl,他只支持新型的excell( xlsx)格式,读取速度还可以 1.安装 pip install openpyxl 2.使用 ...
- org.apache.poi.ss.usermodel 类操作excel数据遗漏
直接上图. 错误程序: 循环读取每一行的单元格数据部分 //for (int j = row.getFirstCellNum(); j < row.getLastCellNum(); j++) ...
- xlwings 操作 excel
xlwings: xlwings是一个Python库,它使Python的一些数据分析特性可以在Excel实例中使用,包括对numpy数组.pandas Series和DataFrame的支持.与其他任 ...
- Delphi - 操作Excel数据公式的实现
procedure TF_SMP_FT_NEW.RzBitBtn_StartToChangeClick(Sender: TObject); var i, j, ni, nj, iRows, iCol, ...
- matlab操作Excel数据
sheet是Excel的表格,xIRange是表格的列的范围 指定xlRange,例如使用语法'C1:C2',其中C1和C2是定义要读取的区百域的两个度相对的角. 例如,'D2:H4'表示工作表上的两 ...
随机推荐
- Mongoose Guide(转)
转自:http://www.w3c.com.cn/mongoose-guide Queries 文件可以通过一些静态辅助模型的方法检索. 任何涉及 指定 查询 条件的模型方法,有两种执行的方式: 当一 ...
- 内网渗透 day2-nmap和nc的使用
nmap和nc的使用 nmap的使用 1. nmap -sSV 172.16.100.214 -T4 -F -sS进行SYN扫描,是比较隐匿的 -sV探测打开端口的服务的信息 -sSV将上面两种一起使 ...
- jupyter使用自动补全和切换默认浏览器
自动补全 可以做conda环境中执行以下命令.linux下打开conda环境的命令是: conda activate 退出conda环境的命令是: conda deactivate 安装插件: pip ...
- 【JVM第五篇--运行时数据区】方法区
写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.栈.堆.方法区的关系 虚拟机运行时的数据区如下所示: 即方法区是属于线程共享的内 ...
- linux tcp Nagle算法,TCP_NODELAY和TCP_CORK 转载
转载自: http://www.cnhalo.net/2016/08/13/linux-tcp-nagle-cork/ http://abcdxyzk.github.io/blog/2018/07/0 ...
- MySQL中EXPLAIN结果的参数详解
explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了.如: mysql& ...
- mysql权限管理命令
#创建用户 create user 'songwp' IDENTIFIED BY '1234' #用户授权 GRANT ALL ON DB01.* TO 'songwp' #撤销权限 REVOKE A ...
- xml格式数据和数组数据互相转换
数组转换成xml数据 <?php $arr=array( 'username'=>'huahua', 'password'=>'123456', 'number'=>'1588 ...
- 面试阿里,字节,美团必看的Spring的Bean管理详解
IOC容器 工厂只负责创建对象,而Spring当然不仅仅是一个对象工厂,其核心是一个对象容器,其具备控制反转的能力,所以也称为IOC容器. 帮助我们存放对象,并且管理对象,包括:创建.销毁.装配,这样 ...
- FL Studio中有关Sub Bass的一些制作与混音技巧
1.Sub Bass是什么? Sub Bass是一种低沉的低音,其频率大约低于60赫兹,并向下延伸,包括人类所能听到的最低频率,约为20赫兹.在这个范围内,人类的听觉不是很灵敏,所以在这个范围内的声音 ...

