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检测远程端口是否打开的方法
Mar 14 Python
在Python中处理时间之clock()方法的使用
May 22 Python
Python实现文件内容批量追加的方法示例
Aug 29 Python
Python内建函数之raw_input()与input()代码解析
Oct 26 Python
Python多线程threading和multiprocessing模块实例解析
Jan 29 Python
浅谈python爬虫使用Selenium模拟浏览器行为
Feb 23 Python
python实现zabbix发送短信脚本
Sep 17 Python
python实现将文件夹下面的不是以py文件结尾的文件都过滤掉的方法
Oct 21 Python
Python3按一定数据位数格式处理bin文件的方法
Jan 24 Python
Python文本处理简单易懂方法解析
Dec 19 Python
聊聊python中的循环遍历
Sep 07 Python
仅用几行Python代码就能复制她的U盘文件?
Jun 26 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手册及PHP编程标准
2006/12/17 PHP
Look And Say 序列php实现代码
2011/05/22 PHP
再Docker中架设完整的WordPress站点全攻略
2015/07/29 PHP
[原创]PHPCMS遭遇会员投稿审核无效的解决方法
2017/01/11 PHP
javascript 学习之旅 (3)
2009/02/05 Javascript
jquery ui dialog ie8出现滚动条的解决方法
2010/12/06 Javascript
js的alert弹出框出现乱码解决方案
2013/09/02 Javascript
分享几种比较简单实用的JavaScript tabel切换
2015/12/31 Javascript
JQUERY的AJAX请求缓存里的数据问题处理
2016/02/23 Javascript
jquery简单插件制作(fn.extend)完整实例
2016/05/24 Javascript
jQuery+css实现非常漂亮的水平导航菜单效果
2016/07/27 Javascript
vue自定义过滤器创建和使用方法详解
2017/11/06 Javascript
详解Vue快速零配置的打包工具——parcel
2018/01/16 Javascript
vue项目中引入noVNC远程桌面的方法
2018/03/05 Javascript
微信小程序获取音频时长与实时获取播放进度问题
2018/08/28 Javascript
微信小程序身份证验证方法实现详解
2019/06/28 Javascript
Vue SPA 初次进入加载动画实现代码
2019/11/14 Javascript
Js on及addEventListener原理用法区别解析
2020/07/11 Javascript
ElementUI 修改默认样式的几种办法(小结)
2020/07/29 Javascript
在Python中使用dict和set方法的教程
2015/04/27 Python
python中enumerate函数遍历元素用法分析
2016/03/11 Python
Python操作csv文件实例详解
2017/07/31 Python
Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
2017/12/12 Python
python flask中静态文件的管理方法
2018/03/20 Python
解决Ubuntu pip 安装 mysql-python包出错的问题
2018/06/11 Python
详解python异步编程之asyncio(百万并发)
2018/07/07 Python
python 控制台单行刷新,多行刷新实例
2020/02/19 Python
Python自动创建Excel并获取内容
2020/09/16 Python
HTML5之HTML元素扩展(上)—新增加的元素及使用概述
2013/01/31 HTML / CSS
Html5 web本地存储实例详解
2016/07/28 HTML / CSS
机械设计专业应届生求职信
2013/11/21 职场文书
最新大学生创业计划书写作攻略
2014/04/02 职场文书
网络编辑求职信
2014/04/30 职场文书
英语课前三分钟演讲稿(6篇)
2014/09/13 职场文书
Python办公自动化之教你用Python批量识别发票并录入到Excel表格中
2021/06/26 Python
oracle重置序列从0开始递增1
2022/02/28 Oracle