Python 使用 xlwt 模块将多行多列数据循环写入 Excel 文档的操作
本文介绍如何使用 Python 的 xlwt 模块,通过循环方式将多行多列数据高效写入 Excel 文档。文章提供了完整的代码示例,展示了如何解析 XML 数据并提取主机名与 IP 地址,利用 xlwt 的 write 方法逐行逐列写入数据,最终保存为 xls 格式文件。
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_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')
注意:代码中存在少量冗余行,为保持逻辑清晰未做删除处理。
Python 写入 xlsx 大量数据的问题与优化
补充知识:关于通过 Python 写入 xlsx 格式大量数据的问题探讨。
以往批量生成数据文件时,通常通过 C 程序直接按逗号分隔方式写入文本文件并保存为 csv 格式。然而,部分业务人员习惯使用 xls 格式查看数据表,因此提出需求进行改造。对于数据量小于 100w 的情况,要求将报表格式统一改为 xlsx 文件。
考虑到报表文件处理的便捷性,决定采用 Python 实现。起初使用了 openpyxl 库,该库提供强大的 xlsx 读写 API,能方便地实现读写操作。但在实际测试中发现,处理大行数 xlsx 文件时内存占用极高,例如 8 个字段、50w 行数据在运行过程中内存占用高达 10G,这超出了应用服务器的承受能力。
为此寻求优化方案,经查阅资料发现,openpyxl 在创建 xlsx 表时指定 write_only 参数是处理大数据写入的官方解决方案。以下引用官网范例:启用此参数后,无法通过 ws.cell(row=i, column=j).value = ? 的方式赋值,只能使用 append 方式追加行。关于设置只写模式下的单元格样式,可参考官网文档。
openpyxl write_only 模式示例
>>> 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} 即可。
writexlsx 大文件处理示例
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 文档的操作即为全部内容,希望能对大家有所帮助,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









