I have a really simple bit of code, where I have a group of file names and I need to open each one and extract some data to later manipulate.
for file in unique_file_names[1:]:
file_name = rootdir + "/" + str(file)
test_time = time.clock()
try:
wb_loop = load_workbook(file_name, read_only=True, data_only=True)
ws_loop = wb_loop["SHEET1"]
df = pd.DataFrame(ws_loop.values)
print("Opening Workbook: ", time.clock()-test_time)
newarray = np.vstack((newarray, df.loc[4:43,:13].values))
print("Data Manipulation: ", time.clock()-test_time)
So I've tried a few different modules to read in excel files, including directly using pandas.read_excel() and this is the optimum method, managing to get the time to open the workbook to 1.5-2s, and the numpy stacking takes 0.03 seconds ish.
I think allocating the data to a third dimension in the array based on an index would probably be quicker but I'm more focused on speeding up the time to load the spreadsheets, any suggestions?
Edit: I did also create a multithread pool to try and speed this up but for some reason it started using 15Gb ram and crashed my computer
Edit 2:
So the fastest way this was done was using xlrd as per the accepted answers recommendation. I also realised that it was quicker to delete the workbook at the end of the loop. The final code looks like
for file in unique_file_names[1:]:
file_name = rootdir + "/" + str(file)
test_time = time.clock()
try:
wb_loop = xlrd.open_workbook(file_name, on_demand = True)
ws_loop = wb_loop.sheet_by_name("Sheet1")
print("Opening Workbook: ", time.clock()-test_time)
df = pd.DataFrame([ws_loop.row_values(n) for n in range(ws_loop.nrows)])
newarray = np.vstack((newarray, df.loc[4:43,:13].values))
del wb_loop
print("Data Manipulation: ", time.clock()-test_time)
except:
pass
counter+=1
print("%s %% Done" %(counter*100/len(unique_file_names)))
wb_new = xlwt.Workbook()
ws_new = wb_new.add_sheet("Test")
ws_new.write(newarray)
wb_new.save(r"C:Libraries/Documents/NewOutput.xls")
This outputs an average time per loop of 1.6-1.8s. Thanks for everyones help.