亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python 利用xlwt模塊實現將數據寫入excel文件

發布時間:2020-11-11 15:16:49 來源:億速云 閱讀:168 作者:Leah 欄目:開發技術

Python 利用xlwt模塊實現將數據寫入excel文件?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import xlwt
import re

def host_regex(dataline):
 host_regex = r"<host>(.*&#63;)</host>"
 host = re.findall(host_regex, dataline)
 if host:
  return host[0]

def ip_regex(dataline):
 ip_regex = r"<ip>(.*&#63;)</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

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

诸暨市| 博爱县| 海原县| 郧西县| 兰考县| 察哈| 威远县| 荔波县| 南安市| 呼图壁县| 新野县| 辛集市| 云龙县| 射洪县| 河间市| 兴和县| 龙游县| 乐平市| 来安县| 竹溪县| 腾冲县| 灌南县| 天祝| 昭觉县| 太仓市| 灵丘县| 南宁市| 新巴尔虎左旗| 卢氏县| 修水县| 丰顺县| 驻马店市| 陈巴尔虎旗| 高密市| 钟山县| 镇康县| 什邡市| 个旧市| 德安县| 姜堰市| 宜川县|