Python 使用xlwt模块将多行多列数据循环写入excel文档的操作


Posted in Python onNovember 10, 2020

我就废话不多说了,大家还是直接看代码吧~

#!/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_export_hosts.xml", "r", encoding="utf8") as f:
 lines = f.readlines()
 alldatas = []
 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文档的操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python新手们容易犯的几个错误总结
Apr 01 Python
Python中的pygal安装和绘制直方图代码分享
Dec 08 Python
使用python和Django完成博客数据库的迁移方法
Jan 05 Python
numpy使用技巧之数组过滤实例代码
Feb 03 Python
Python闭包执行时值的传递方式实例分析
Jun 04 Python
python实现猜单词小游戏
May 22 Python
python实现图书借阅系统
Feb 20 Python
python如何制作缩略图
Apr 30 Python
Python 实现一个手机号码获取妹子名字的功能
Sep 25 Python
Python logging模块写入中文出现乱码
May 21 Python
Python ADF 单位根检验 如何查看结果的实现
Jun 03 Python
Python JSON常用编解码方法代码实例
Sep 05 Python
详解vscode实现远程linux服务器上Python开发
Nov 10 #Python
Python调用飞书发送消息的示例
Nov 10 #Python
python中pyplot基础图标函数整理
Nov 10 #Python
python图片合成的示例
Nov 09 #Python
python 实现&quot;神经衰弱&quot;翻牌游戏
Nov 09 #Python
Python字典dict常用方法函数实例
Nov 09 #Python
Python实现哲学家就餐问题实例代码
Nov 09 #Python
You might like
人族 TERRAN 概述
2020/03/14 星际争霸
深入分析使用mysql_fetch_object()以对象的形式返回查询结果
2013/06/05 PHP
PHP static局部静态变量和全局静态变量总结
2014/03/02 PHP
PHP实现从远程下载文件的方法
2015/03/12 PHP
JavaScript与HTML结合的基本使用方法整理
2015/10/12 PHP
在 Laravel 6 中缓存数据库查询结果的方法
2019/12/11 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
2019/12/20 PHP
jsTree树控件(基于jQuery, 超强悍)[推荐]
2009/09/01 Javascript
javascript 动态生成私有变量访问器
2009/12/06 Javascript
JQuery性能优化的几点建议
2014/05/14 Javascript
JavaScript数组常用方法
2015/03/02 Javascript
XML、HTML、CSS与JS的区别整理
2016/02/18 Javascript
学习vue.js中class与style绑定
2016/12/03 Javascript
node.js与C语言 实现遍历文件夹下最大的文件,并输出路径,大小
2017/01/20 Javascript
JavaScript获取当前时间向前推三个月的方法示例
2017/02/04 Javascript
canvas实现环形进度条效果
2017/03/23 Javascript
Python中类型检查的详细介绍
2017/02/13 Python
python微信跳一跳系列之自动计算跳一跳距离
2018/02/26 Python
python异常触发及自定义异常类解析
2019/08/06 Python
Flask框架学习笔记之表单基础介绍与表单提交方式
2019/08/12 Python
django 做 migrate 时 表已存在的处理方法
2019/08/31 Python
css3的图形3d翻转效果应用示例
2014/04/08 HTML / CSS
顶级宝石首饰网络零售商:Angara
2016/10/25 全球购物
英国领先的运动营养品牌:Protein Dynamix
2018/01/02 全球购物
Nike法国官方网站:Nike.com FR
2018/07/22 全球购物
海蓝之谜英国官网:La Mer英国
2020/01/15 全球购物
Maxpeedingrods美国:高性能汽车零件
2020/02/14 全球购物
高中军训感想800字
2014/02/23 职场文书
企业晚会策划方案
2014/05/29 职场文书
讲文明懂礼貌演讲稿
2014/09/11 职场文书
商超业务员岗位职责
2015/02/13 职场文书
2015年学校体育工作总结
2015/04/22 职场文书
学校通报表扬范文
2015/05/04 职场文书
团队拓展训练心得体会
2016/01/12 职场文书
2016年机关单位节能宣传周活动总结
2016/04/05 职场文书
合同范本之电脑出租
2019/08/13 职场文书