Python使⽤xlwt模块将多⾏多列数据循环写⼊excel⽂档
的操作
我就废话不多说了,⼤家还是直接看代码吧~
#!/usr/bin/python
# -*- coding: utf-8 -*-
import xlwt
import re
def host_regex(dataline):
host_regex = r"<host>(.*?)</host>"
host = re.findall(host_regex, dataline)
if host:
return host[0]
def ip_regex(dataline):
ip_regex = r"<ip>(.*?)</ip>"
ip = re.findall(ip_regex, dataline)
if ip:
return ip[0]
with open("zbx_l", "r", encoding="utf8") as f:
lines = f.readlines()
alldatas = []
python官方文档中文版hostlist = []
iplist = []
for line in lines:
host = host_regex(line)
ip = ip_regex(line)
if host is not None:
hostlist.append(host)
if ip is not None:
iplist.append(ip)
hosts_ip = []
# 构造数据结构,形如:[[a,b],[c,d],...]
multi_list = map(list, zip(hostlist, iplist))
for multi in multi_list:
hosts_ip.append(multi)
workbook = xlwt.Workbook()
worksheet = workbook.add_sheet('test')
# 关键代码
for hi in enumerate(hosts_ip):
for num in range(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设置样式,可以直接查看
>>> from openpyxl import Workbook
>>> wb = Workbook(write_only=True)
>>> ws = wb.create_sheet()
>>>
>>> # now we'll fill it with 100 rows x 200 columns
>>>
>>> for irow in range(100):
... ws.append(['%d' % i for i in range(200)]) #可以先将⼀⾏的数据写在⼀个list中,直接ws.append(list)
>>> # save the file
>>> wb.save('new_big_file.xlsx') # doctest: +SKIP
不过仅仅按上述范例修改write_only跑数时发现内存占⽤并没有缓解,再仔细阅读官⽹说明时才发现这么⼀句话“When you want to dump large amounts of data make sure you have lxml installed.”原来在openpyxl安装时,并没有把lxml作为强依赖,只是⼀个可选包,然后查实发现确实服务器上并没有安装lxml包。
于是与为了解决这个问题先在测试环境上安装lxml,安装过程也不是很顺利。
⾸先先要装libxml2以及libxslt,因为没有root权限,均为源码安装,且只能安装在⽤户⽬录。需要注意的是libxml2在安装时需要--with-python='python安装⽬录',libxslt安装的时候需要指定libxml2安装⽬录。
尤其最后的lxml安装也是坑挺多的,主要是指定libxml2和libxslt,安装lxml时先python3 setup.py build_ext -i -
I${libxml2includepath} -L${libxml2libpath} -I${libxsltincludepath} -L${libxsltlibpath} ,再python3 setup.py install。
全部安装完之后,确实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⽂档的操作就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论