创建Treeview数据导出CSV按钮时遇TypeError错误求助
问题描述
我尝试创建一个可将数据导出为CSV格式的按钮,但遇到了问题。我的数据框为df1,需求如下:
- 若未上传数据,弹出提示框显示“No Data”、“No data available to export”
- 若有数据,通过
filedialog.asksaveasfilename函数指定位置保存数据
相关代码:
def export(): global df1 if len(df1) < 1: messagebox.showerror("No Data", " No data available to export") return False fln = filedialog.asksaveasfilename(initialdir=os.getcwd(), title="Save CSV", filetypes=(("CSV File", "*.csv"),("All Files","*.*"))) with open(fln, mode='w') as myfile: exp_writer = csv.writer(myfile, delimiter='\t') for i in tv1.get_children(): row = tv1.item(i)['values'] exp_writer.writerow(row) messagebox.showinfo("Data Exported", "Your data has been exported to "+os.path.basename(fln)+" sucessfully.")
运行时出现错误:
Exception in Tkinter callback Traceback (most recent call last): File "C:\Python\anaconda3\lib\tkinter\__init__.py", line 1892, in __call__ return self.func(*args) File "C:\Users\Mahmoud Khadijeh\Desktop\Python2\Python\FTIR.py", line 344, in export with open(fln, mode='w') as myfile: TypeError: open() got an unexpected keyword argument 'mode'
解决方案
1. 核心问题:open函数被自定义函数覆盖
这个错误的主要原因是你代码的其他位置定义了一个名为open的自定义函数,覆盖了Python内置的open函数。内置open支持mode关键字参数,但自定义的open函数没有该参数,导致报错。
- 检查代码中是否存在
def open(...):的定义,将其重命名为其他名称(比如custom_open)即可解决参数错误问题。
2. 处理用户取消保存的情况
当用户在保存对话框中点击“取消”时,filedialog.asksaveasfilename会返回None,此时调用open会触发额外错误,需要添加判断逻辑:
def export(): global df1 if len(df1) < 1: messagebox.showerror("No Data", "No data available to export") return False fln = filedialog.asksaveasfilename(initialdir=os.getcwd(), title="Save CSV", filetypes=(("CSV File", "*.csv"),("All Files","*.*"))) # 检查用户是否取消保存操作 if not fln: return # 使用内置open函数,添加newline=''避免Windows下CSV出现空行 with open(fln, 'w', newline='') as myfile: exp_writer = csv.writer(myfile, delimiter='\t') # 可选:导出Treeview的表头 headers = [col for col in tv1['columns']] exp_writer.writerow(headers) # 导出每行数据 for i in tv1.get_children(): row = tv1.item(i)['values'] exp_writer.writerow(row) # 修复拼写错误:sucessfully → successfully messagebox.showinfo("Data Exported", f"Your data has been exported to {os.path.basename(fln)} successfully.")
3. 额外优化点
- 添加
newline=''参数:避免Windows系统下导出的CSV文件每行之间出现空行 - 导出表头:让CSV文件结构更完整,便于后续查看
- 修正提示文本中的拼写错误,提升专业度
内容的提问来源于stack exchange,提问作者Mhmoud Khadija
相关产品推荐
相关产品推荐

