pandas的read_excel函数运行过慢,搭配tkinter选文件时如何优化?
问题根因
卡顿本质是Tkinter的UI渲染与同步代码都运行在主线程,路径标签的更新操作会被后续的pd.read_excel()读文件操作阻塞,必须等读文件完成后UI才会完成渲染,所以看起来路径显示延迟。
解决办法
方法1:强制先刷新UI(最简单,代码改动最小)
在路径标签创建放置完成后,先调用窗口的update()方法强制刷新所有UI变更,再执行读文件操作,即可先看到路径再等待读文件完成。
示例代码:
def fileopen(): filepath = filedialog.askopenfilename(filetypes=(("xlsx", "*.xlsx"), ("all files", "*.*"))) label = Label(window, text=filepath) label.pack() label.place(x=200, y=80) # 强制刷新UI,优先显示路径 window.update() df = pd.read_excel(filepath)
方法2:优化pd.read_excel()读文件速度
如果Excel文件本身过大,可通过参数裁剪读取范围、降低解析开销,直接减少读文件耗时:
- 用
usecols参数指定只读取需要用到的列,避免加载无关列 - 用
skiprows参数跳过表头前的无效行 - 用
engine="openpyxl"搭配engine_kwargs={"data_only": True}只读单元格值,跳过公式、格式等无关内容解析 - 升级pandas、openpyxl到最新版本,旧版本普遍存在性能问题
示例代码:
df = pd.read_excel( filepath, usecols=["需要的列名1", "需要的列名2"], # 按需填写 skiprows=2, # 按需调整跳过的行数 engine="openpyxl", engine_kwargs={"data_only": True} )
方法3:子线程执行读文件操作(最流畅,UI全程无卡顿)
如果文件过大读文件耗时很长,即使先显示路径,主线程被读文件占用时整个窗口都会处于无响应状态,此时可以把读文件逻辑放到子线程执行,完全不阻塞UI渲染:
示例代码:
import threading # 读文件完成后的回调函数,处理读好的df,只能在这里操作UI def after_load(df): # 此处填写你的后续业务逻辑,比如把df内容展示到界面上 pass # 子线程执行的读文件逻辑 def load_excel_async(filepath): df = pd.read_excel(filepath) # 切回主线程执行UI操作 window.after(0, lambda: after_load(df)) def fileopen(): filepath = filedialog.askopenfilename(filetypes=(("xlsx", "*.xlsx"), ("all files", "*.*"))) label = Label(window, text=filepath) label.pack() label.place(x=200, y=80) # 启动子线程执行读文件,不阻塞主线程UI threading.Thread(target=load_excel_async, args=(filepath,), daemon=True).start()
内容的提问来源于stack exchange,提问作者Moon
相关产品推荐
相关产品推荐

