一个使用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'表示工作表上的两 ...
随机推荐
- fasd
基本排序算法 冒泡排序 没什么可说的, 改进方法就是加一个标志位防止有序后重复遍历. 由于需要遍历两次, 所以时间复杂度O(N^2) 传送门 --> 冒泡排序 选择排序 外层从0开始默认oute ...
- Python调用飞书发送消息
一.创建飞书机器人 自定义飞书机器人操作步骤,具体详见飞书官方文档:<机器人 | 如何在群聊中使用机器人?>
- leetcode99:n-queens
题目描述 N皇后问题是把N个皇后放在一个N×N棋盘上,使皇后之间不会互相攻击. 给出一个整数n,返回n皇后问题的所有摆放方案 例如: 4皇后问题有两种摆放方案 [".Q..", ...
- 2012年游戏软件开发独立本科段01B0815自考科目
01B0815自考科目 课程代码[学分] 课程名称 03708[02] 中国近现代史纲要 03709[04] 马克主义基本原理概论 03684[10] 综合英语(四) 01042[05] 应用数学 0 ...
- tcpdump详解(转)
tcpdump是Linux下强大的抓包工具,不仅可以分析数据包流向,还可以对数据包内容进行监听.通过分析数据包流向,可以了解一条连接是如何建立双向连接的.tcpdump允许用户(一般是root)拦截和 ...
- python实战GUI界面+mysql
前言 前面用tkinter做了一个巨丑的GUI界面,今天想把它变漂亮起来,重新找回page做了一个界面,它也是基于tkinter开发的所见即所得的界面编辑器,前面因为代码搞不明白没用上,现在重新研究一 ...
- ubuntu无法关机
在/etc/default/halt 增加下面 INIT_HALT = POWEROFF 另一种方法: I have the same problem and found a solution whi ...
- mysql之sql语句逻辑执行顺序
1. (1)from先执行,from执行后就会将所有表(多个表时和单表所有的表)数据加载到内存中了 (2)ON执行,得到连接表用的连接条件. (3)JOIN执行,根据ON的连接条件,将from加载的所 ...
- hive显示列名
查询时显示列名:hive> set hive.cli.print.header;hive.cli.print.header=falsehive> set hive.cli.print.he ...
- 如何用Prometheus监控十万container的Kubernetes集群
概述 不久前,我们在文章<如何扩展单个Prometheus实现近万Kubernetes集群监控?>中详细介绍了TKE团队大规模Kubernetes联邦监控系统Kvass的演进过程,其中介绍 ...