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在windows下实现ping操作并接收返回信息的方法
Mar 20 Python
详解Python中expandtabs()方法的使用
May 18 Python
对于Python中RawString的理解介绍
Jul 07 Python
python对html过滤处理的方法
Oct 21 Python
django页面跳转问题及注意事项
Jul 18 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
Aug 05 Python
Python二元赋值实用技巧解析
Oct 25 Python
python读写Excel表格的实例代码(简单实用)
Dec 19 Python
Pytorch中的VGG实现修改最后一层FC
Jan 15 Python
Python爬虫入门有哪些基础知识点
Jun 02 Python
Python3开发环境搭建详细教程
Jun 18 Python
python设置表格边框的具体方法
Jul 17 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中ADODB类详解
2008/03/25 PHP
基于OpenCV的PHP图像人脸识别技术
2009/10/11 PHP
PHP+MYSQL会员系统的开发实例教程
2014/08/23 PHP
Yii列表定义与使用分页方法小结(3种方法)
2016/07/15 PHP
深入解析PHP底层机制及相关原理
2020/12/11 PHP
在JS中最常看到切最容易迷惑的语法(转)
2010/10/29 Javascript
JavaScript高级程序设计 错误处理与调试学习笔记
2011/09/10 Javascript
jquery.boxy弹出框(后隔N秒后自动隐藏/自动跳转)
2013/01/15 Javascript
jquery移除button的inline onclick事件(已测试及兼容浏览器)
2013/01/25 Javascript
JS 添加千分位与去掉千分位的示例
2013/07/11 Javascript
利用NodeJS和PhantomJS抓取网站页面信息以及网站截图
2013/11/18 NodeJs
在AngularJS框架中处理数据建模的方式解析
2016/03/05 Javascript
拥有一个属于自己的javascript表单验证插件
2016/03/24 Javascript
jQuery+CSS3实现点赞功能
2017/03/13 Javascript
BootStrap 表单控件之单选按钮水平排列
2017/05/23 Javascript
jQuery实现侧边栏隐藏与显示的方法详解
2018/12/22 jQuery
利用Vue实现一个markdown编辑器实例代码
2019/05/19 Javascript
python多重继承新算法C3介绍
2014/09/28 Python
深入理解Python3中的http.client模块
2017/03/29 Python
Python 实现数据库(SQL)更新脚本的生成方法
2017/07/09 Python
python实现感知器算法详解
2017/12/19 Python
python3解析库BeautifulSoup4的安装配置与基本用法
2018/06/26 Python
python3.6的venv模块使用详解
2018/08/01 Python
Python 进程之间共享数据(全局变量)的方法
2019/07/16 Python
Pytorch to(device)用法
2020/01/08 Python
基于python 凸包问题的解决
2020/04/16 Python
PyCharm2020.1.1与Python3.7.7的安装教程图文详解
2020/08/07 Python
python基本算法之实现归并排序(Merge sort)
2020/09/01 Python
使用jTopo给Html5 Canva中绘制的元素添加鼠标事件
2014/05/15 HTML / CSS
北美领先的牛仔品牌:Buffalo David Bitton
2017/05/22 全球购物
linux系统都有哪些运行级别
2016/03/26 面试题
化学实验员岗位职责
2013/12/28 职场文书
2015年护士长个人工作总结
2015/04/24 职场文书
2015年维修工作总结
2015/04/25 职场文书
mysql 联合索引生效的条件及索引失效的条件
2021/11/20 MySQL
Python写情书? 10行代码展示如何把情书写在她的照片里
2022/04/21 Python