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')

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를 통해서만 줄을 추가할 수 있습니다.셀 설정 스타일만 쓰는 설정에 관해서는 직접 볼 수 있습니다홈페이지

>>> 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를 설치해야 합니다. 루트 권한이 없기 때문에 모두 원본 코드로 설치되고 사용자 디렉터리에만 설치할 수 있습니다.주의해야 할 것은libxml2는 설치할 때 --with-python='python 설치 디렉터리'가 필요하고,libxslt를 설치할 때libxml2 설치 디렉터리를 지정해야 합니다.
특히 마지막 lxml 설치도 구덩이가 매우 많은데 주로libxml2와libxslt를 지정하고 lxml을 설치할 때python3setup을 먼저 설치한다.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 문서에 순환하여 쓰는 작업은 바로 편집자가 여러분에게 공유하는 모든 내용입니다. 여러분께 참고가 되고 저희를 많이 사랑해 주시기 바랍니다.

좋은 웹페이지 즐겨찾기