【发布时间】:2018-06-26 03:17:59
【问题描述】:
我是一个完整的 Python 初学者,正在尝试制作一个允许用户选择 Excel 文件的 GUI,从中提取和分析一些数据。对于 GUI,我使用 tkinter,对于 Excel 操作,我使用 openpyxl。 The code that I currently have works, but when the Excel file selected is large, the runtime is stupidly long (a 10,000 row x 20 column spreadsheet took about an hour to iterate through, and just got slower as time went by) .此外,GUI 在迭代期间停止响应。 我之前使用 MATLAB 制作的程序几乎完全相同,它运行得非常好,整个迭代过程只需要一两秒,所以有些东西肯定很时髦这里。现在我知道这是我的问题,而不是 Python,所以我希望你们能帮助我指出如何解决它的正确方向。
以下是我正在使用的一些简化示例,以帮助说明我的情况。我需要浏览电子表格的每一行,检查该行中的某个值以查看它是否与我想要的匹配,如果匹配,我会存储该行中的一些数据。
wb = openpyxl.load_workbook(filename = 'some_garbage.xlsx', read_only=True).worksheets[0]
all_data = wb.cell
desiredColor = 'Purple'
foodStorage = []
for row in range(2, wb.max_row + 1):
print(row)
if(all_data(row, 1).value == desiredColor):
foodStorage.append(all_data(row,2))
print('I found purple! Yee')
我应该使用 openpyxl 以外的模块来完成这项任务,还是我只是犯了一些错误,使 openpyxl 无法发挥其全部潜力? 我应该使用线程来加速迭代过程,还是确保我的 GUI 窗口在迭代执行时不会对我全部“无响应”?
我尝试搜索有关类似问题的问题,但我并没有真正找到我正在寻找的内容,这很可能是因为我无法将我的问题用恰当的语言表达出来。因此,我提前向您提出可能已经回答过一百万次的问题深表歉意。感谢您提供任何帮助,并感谢您的宝贵时间。
【问题讨论】:
-
您应该仔细检查
max_row的值。当我最终使用它时,它返回电子表格的最大可能行而不是最后一行。例如,我有一个包含 4777 行的电子表格,但是max_row返回了65536行。 -
嗯,这很奇怪,我的不这样做。正如我所期望的那样,它返回最后一行。也许这只是我们的电子表格之间的差异?
-
这是一个常见问题。存在几个错误报告。那就是说,如果它不影响您,那很好。只需要弄清楚问题是什么。我认为这是大量的列。当我使用 openpyxl 时,我通常将我的电子表格减少到只需要比较的列,然后从中创建另一个包含所有数据的电子表格。否则加载文件只是为了读取需要很长时间,然后运行代码也可能需要很长时间。
-
当您说减少电子表格时,您的意思是您只需进入 Excel 并删除您不想要的列吗?或者有没有办法指定 openpyxl 只关心某些列?
-
我手动删除了不需要的列。这帮助我将速度提高了 20% 到 90%。这样做对我来说不是问题,但我相信如果你不需要做这样的事情会更好。
标签: python python-3.x optimization tkinter openpyxl