【发布时间】:2019-11-01 21:50:55
【问题描述】:
我有一段非常简单的代码,其中有一组文件名,我需要打开每个文件名并提取一些数据以供以后操作。
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)
所以我尝试了几个不同的模块来读取 excel 文件,包括直接使用 pandas.read_excel() 这是最佳方法,设法将打开工作簿的时间缩短到 1.5-2 秒,并且 numpy堆叠大约需要 0.03 秒。
我认为根据索引将数据分配到数组中的第三维可能会更快,但我更专注于加快加载电子表格的时间,有什么建议吗?
编辑:我还创建了一个多线程池来尝试加快速度,但由于某种原因,它开始使用 15Gb 内存并导致我的计算机崩溃
编辑 2:
因此,完成此操作的最快方法是根据接受的答案建议使用 xlrd。我还意识到在循环结束时删除工作簿会更快。最终代码看起来像
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")
这会输出每个循环 1.6-1.8 秒的平均时间。感谢大家的帮助。
【问题讨论】:
-
将 Excel 文件读入 Pandas 自然比其他选项(CSV、Pickle、HDF5)要慢。如果您希望提高性能,我强烈建议您考虑这些其他格式。
-
除非我在打开之前自己进行了转换,否则是不可能的
-
你试过
read_excel()和sheet_name="SHEET1"和dtype=object吗?这些通常是读取数据时明显的优化。 -
我试了一下,上次我尝试它时它把时间提高到了大约 3 秒。可能不得不再试一次
标签: python excel python-3.x pandas performance