使用Python将SPSS数据有效写入Excel

我正在尝试使用Python将数据从打开的SPSS数据集写入Excel文件。 下面的程序工作正常,但是对于有140万个数据点(2500个,700个variables)的文件大约需要35秒。

现在,我正在遍历每个案例(作为一个元组),然后将元组的每个元素分配到一个单元格中。 openpyxl是Excel模块的select(因为我以前没有使用任何其他)。

我将使用Python程序来处理更大的数据集,所以我想知道是否有更高效的逻辑。

 BEGIN PROGRAM. import spssdata import spss,spssaux, sys import openpyxl from openpyxl import Workbook import gc #initialise timer time_start = time.time() #Create the workbook to save the codebook wb=openpyxl.Workbook() ws1=wb.create_sheet() spss.StartDataStep() MyFile = spss.Dataset() varDict = spssaux.VariableDict() MyCases=MyFile.cases MyVars=MyFile.varlist for varnum, varname in enumerate(MyFile.varlist): ws1.cell(row=1,column=varnum+1).value=varname.name ws2.cell(row=1,column=varnum+1).value=varname.name for eachcase in range (len(MyCases)): for eachvar in range (len(MyCases[eachcase])): ValueToWrite=MyCases[eachcase][eachvar] ws1.cell(row=eachcase+2,column=eachvar+1).value=ValueToWrite spss.EndDataStep() wb.save("some filename") del wb gc.collect() time_end = time.time() time_taken = int(time_end-time_start) print ("Saving took " + str(time_taken) + " seconds.") END PROGRAM. 

您可以尝试使用win32com方法。 这通常非常缓慢,但它具有能够在单个呼叫中执行大部分数据传输的优点。 您只需要将您的数据准备到适当大小的列表中:

 import win32com.client as win32 data = [["A", "B"] for _ in range(10000)] excel = win32.gencache.EnsureDispatch('Excel.Application') excel.DisplayAlerts = False wb = excel.Workbooks.Add() ws = wb.Worksheets.Add() ws.Range(ws.Cells(1, 1), ws.Cells(len(data), 2)).Value = data wb.SaveAs(r'c:\python\test.xlsx') excel.Application.Quit() 

range(1000000)计时这需要约7.5秒。

AFAIK在openpyxl没有办法openpyxl写多个单元格。


根据您现有的代码,我会提出一些build议:

 import win32com.client as win32 import time import spss,spssaux, sys #initialise timer time_start = time.time() spss.StartDataStep() MyFile = spss.Dataset() MyCases = MyFile.cases spss.EndDataStep() excel = win32.gencache.EnsureDispatch('Excel.Application') excel.DisplayAlerts = False wb = excel.Workbooks.Add() ws1 = wb.Worksheets("Sheet1") ws2 = wb.Worksheets("Sheet2") # Add header to both sheets ws1.Range(ws1.Cells(1, 1), ws1.Cells(1, len(MyFile.varlist))).Value = MyFile.varlist ws2.Range(ws2.Cells(1, 1), ws2.Cells(1, len(MyFile.varlist))).Value = MyFile.varlist # Copy data ws1.Range(ws1.Cells(2, 1), ws1.Cells(1 + len(MyCases), len(MyCases[0]))).Value = MyCases wb.SaveAs(r'e:\python temp\test.xlsx') excel.Application.Quit() print("Saving took {:.1f} seconds.".format(time.time() - time_start)) 

确保安装了lxml,并假设您可以逐行工作,请使用openpyxl的只写模式。 如果这不是直接可能的,那么你将需要某种中间结构,可以给你行。

通常,spss.Cursor类(或spssdata.Spssdata)比spss.Dataset类快得多,对于此应用程序,不需要数据集类的附加function。 虽然数据集的速度在写入统计信息时主要是一个问题,但Cursor类仍然可能会更快。