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网络编程实例简析
Sep 26 Python
python使用pil库实现图片合成实例代码
Jan 20 Python
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
Mar 15 Python
python中matplotlib的颜色及线条控制的示例
Mar 16 Python
Django使用HttpResponse返回图片并显示的方法
May 22 Python
使用Python进行目录的对比方法
Nov 01 Python
django框架模板中定义变量(set variable in django template)的方法分析
Jun 24 Python
python print出共轭复数的方法详解
Jun 25 Python
解决Pycharm 导入其他文件夹源码的2种方法
Feb 12 Python
python词云库wordCloud使用方法详解(解决中文乱码)
Feb 17 Python
Django ValuesQuerySet转json方式
Mar 16 Python
jupyter实现重新加载模块
Apr 16 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
PHP中文分词 自动获取关键词介绍
2012/11/13 PHP
微信营销平台系统?刮刮乐的开发
2014/06/10 PHP
php中strlen和mb_strlen用法实例分析
2016/11/12 PHP
php简单构造json多维数组的方法示例
2017/06/08 PHP
制作特殊字的脚本
2006/06/26 Javascript
怎么让脚本或里面的函数在所有图片都载入完毕的时候执行
2006/10/17 Javascript
javascript function、指针及内置对象
2009/02/19 Javascript
jQuery EasyUI 开源插件套装 完全替代ExtJS
2010/03/24 Javascript
jQuery中使用了document和window哪些属性和方法小结
2011/09/13 Javascript
JS控制文本框textarea输入字数限制的方法
2013/06/17 Javascript
JavaScript设计模式之外观模式实例
2014/10/10 Javascript
5个书写JavaScript代码的坏习惯,看看你中枪了没?
2014/11/06 Javascript
jQuery监控文本框事件并作相应处理的方法
2015/04/16 Javascript
javascript中undefined与null的区别
2015/08/16 Javascript
JavaScript通过使用onerror设置默认图像显示代替alt
2016/03/01 Javascript
Web前端新人笔记之jquery入门心得(新手必看)
2016/05/17 Javascript
15位和18位身份证JS校验的简单实例
2016/07/18 Javascript
jQuery 1.9版本以上的浏览器判断方法代码分享
2017/08/28 jQuery
Node.js实现mysql连接池使用事务自动回收连接的方法示例
2018/02/03 Javascript
基于Vue实现图片在指定区域内移动的思路详解
2018/11/11 Javascript
微信小程序地图(map)组件点击(tap)获取经纬度的方法
2019/01/10 Javascript
[42:32]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第二场 11.27
2020/12/01 DOTA
python判断图片宽度和高度后删除图片的方法
2015/05/22 Python
Python 利用切片从列表中取出一部分使用的方法
2019/02/01 Python
Django网络框架之创建虚拟开发环境操作示例
2019/06/06 Python
python性能测量工具cProfile使用解析
2019/09/26 Python
html+css3实现的登录界面
2020/12/09 HTML / CSS
美国鞋类购物网站:Shiekh Shoes
2016/08/21 全球购物
澳大利亚墨水站Ink Station:墨水和碳粉打印机墨盒
2019/03/24 全球购物
德国拖鞋网站:German Slippers
2019/11/08 全球购物
校庆活动方案
2014/03/31 职场文书
商铺消防安全责任书
2014/07/29 职场文书
2015年食堂工作总结报告
2015/04/23 职场文书
英语投诉信范文
2015/07/03 职场文书
高效笔记技巧分享:学会这些让你不再困扰
2019/09/04 职场文书
JavaScript中时间格式化新思路toLocaleString()
2021/11/07 Javascript