Python 使用xlwt模块将多行多列数据循环写入excel文档的操作
我就废话不多说了,大家还是直接看代码吧~
#!/usr/bin/python #-*-coding:utf-8-*- importxlwt importre defhost_regex(dataline): host_regex=r"(.*?) " host=re.findall(host_regex,dataline) ifhost: returnhost[0] defip_regex(dataline): ip_regex=r"(.*?) " ip=re.findall(ip_regex,dataline) ifip: returnip[0] withopen("zbx_export_hosts.xml","r",encoding="utf8")asf: lines=f.readlines() alldatas=[] hostlist=[] iplist=[] forlineinlines: host=host_regex(line) ip=ip_regex(line) ifhostisnotNone: hostlist.append(host) ifipisnotNone: iplist.append(ip) hosts_ip=[] #构造数据结构,形如:[[a,b],[c,d],...] multi_list=map(list,zip(hostlist,iplist)) formultiinmulti_list: hosts_ip.append(multi) workbook=xlwt.Workbook() worksheet=workbook.add_sheet('test') #关键代码 forhiinenumerate(hosts_ip): fornuminrange(len(hi[1])): #行、列、值 worksheet.write(hi[0],num,hi[1][num]) workbook.save('excelwrite.xls')
PS:其实有两行代码冗余,就不删了!
补充知识:通过python写入xlsx大量数据问题简述
以前批处理生成数据文件都是通过c程序直接按照逗号分隔方式写文本文件以csv保存的。但是由于有些处理的数据表直接给业务人员看,业务人员习惯使用xls,因此提了些需求改造,对于一些小于100w的数据均要求改为xlsx文件格式的报表。
考虑报表文件数据处理便捷,因此决定用python实现,最初使用了openpyxl库,这个python库拥有非常强大的xlsx的读写api,能够很方便的实现读写。但是在实际使用中发现在处理较大行数的xlsx时,占用内存非常严重,8个字段50w行数据在运行中内存高达10G,这不是我们应用服务器能够接受的范围。
因此寻求改善,在网上了解后,发现创建xlsx表时,指定write_only参数是openpyxl提供的大数据写入解决方案,以下摘自官网范例,在选择了此参数后,无法通过ws.cell(row=i,column=j).value=?的方式复制,只能通过append的方式追加行。关于设置只写cell设置样式,可以直接查看官网
>>>fromopenpyxlimportWorkbook >>>wb=Workbook(write_only=True) >>>ws=wb.create_sheet() >>> >>>#nowwe'llfillitwith100rowsx200columns >>> >>>forirowinrange(100): ...ws.append(['%d'%iforiinrange(200)])#可以先将一行的数据写在一个list中,直接ws.append(list) >>>#savethefile >>>wb.save('new_big_file.xlsx')#doctest:+SKIP
不过仅仅按上述范例修改write_only跑数时发现内存占用并没有缓解,再仔细阅读官网说明时才发现这么一句话“Whenyouwanttodumplargeamountsofdatamakesureyouhavelxmlinstalled.”原来在openpyxl安装时,并没有把lxml作为强依赖,只是一个可选包,然后查实发现确实服务器上并没有安装lxml包。
于是与为了解决这个问题先在测试环境上安装lxml,安装过程也不是很顺利。
首先先要装libxml2以及libxslt,因为没有root权限,均为源码安装,且只能安装在用户目录。需要注意的是libxml2在安装时需要--with-python='python安装目录',libxslt安装的时候需要指定libxml2安装目录。
尤其最后的lxml安装也是坑挺多的,主要是指定libxml2和libxslt,安装lxml时先python3setup.pybuild_ext-i-I${libxml2includepath}-L${libxml2libpath}-I${libxsltincludepath}-L${libxsltlibpath},再python3setup.pyinstall。
全部安装完之后,确实openpyxl写xlsx不再增加内存,先在tmp目录一个临时文件中写,待调用save方法时,保存到正式文件。
此外在这个问题解决中,还了解到writexlsx库也可以处理大文件xlsx的写入,并且安装没有这么多的依赖,其实还是非常推荐,也很简介,官网有介绍。
操作大文件时指定{'constant_memory':True}即可。
filename='test.xlsx' wb=xlsxwriter.Workbook(filename,{'constant_memory':True}) ws=wb.add_worksheet('大文件') i=0 data=[] data.append('中文') data.append(1323) data.append('abc') ws.write_row(i,0,data) i=i+1 wb.close()#直接关闭即可,不需要额外save
以上这篇Python使用xlwt模块将多行多列数据循环写入excel文档的操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。