написание массива, чтобы преуспеть в Python с Win32com

Я делаю Python, который анализирует файлы данных. Проанализированные данные затем отправляются в файл Excel. Данные могут быть довольно большими. Я смотрю от 10 до 20 столбцов, но количество строк может быть более 100.000.

Написание такого количества данных, чтобы преуспеть с win32com, занимает значительное время. Моим первым шагом было перебрать все ячейки в файле Excel, что занимает очень много времени. После некоторых раскопок я узнал, как можно написать строку одним вызовом, значительно сократив время.

Однако, когда мне нужно отправить 100 000 строк данных, чтобы преуспеть, это все равно займет много времени. Я уверен, что смогу еще больше ускорить это, отправив весь массив одним вызовом. Однако я пока не могу этого достичь.

Посмотрите код ниже, который демонстрирует проблему. Код показывает разницу во времени. Однако третий шаг, отправка всего массива с одним вызовом в диапазон, не приводит к правильным данным в Excel. Что я делаю неправильно?

import win32com.client
import time

#create data array
row = range(0,10)
i = 0
data_array = []
while i < 1000:
    data_array.append(row)
    i += 1

#write the array to an excel file
excel = win32com.client.Dispatch("Excel.Application")
excel.Visible = True
excel.ScreenUpdating = False
book = excel.Workbooks.Add()
sh1 = book.Worksheets(1)
sh2 = book.Worksheets(2)
sh3 = book.Worksheets(3)

#double loop, writing individual cells
print "Writing with double loop to inidividual cells."
start = time.time()
row = 0
for line in data_array:
    row += 1
    col = 0
    for field in line:
        col += 1
        sh1.Cells(row, col).Value = field
print "Processing time: " + str(time.time() - start) + " seconds."

#single loop, writing a row to a range
print "Writing with double loop to inidividual cells."
start = time.time()
row = 0
for line in data_array:
    row += 1
    sh2.Range(sh2.Cells(row,1), sh2.Cells(row, len(line))).Value = line
print "Processing time: " + str(time.time() - start) + " seconds."

#no loop, write array to range
print "Writing with double loop to inidividual cells."
start = time.time()
try:
    sh3.Range(sh3.Cells(row,1), sh3.Cells(len(data_array), len(data_array[0]))).Value = data_array
    print "Processing time: " + str(time.time() - start) + " seconds."
except:
    print "Failed to write array to excel file."

excel.ScreenUpdating = True
sheet = None
book = None
excel.Quit()
excel = None

Ответы на вопрос(3)

Ваш ответ на вопрос