Tkinter写入CSV格式异常:含逗号内容保存格式不符如何修正?
问题描述
我开发了一个用于将数据存入CSV文件的Tkinter应用,代码如下:
def add_file(): global msg msg = entry.get() print(msg) if msg != '': listbox_tasks.insert(END, msg) entry.delete(0, END) else: messagebox.showinfo('Info', 'Please Fill In The Entry Box!') def save_file(msg): with open('hello.csv', 'a', newline='') as f: writer = csv.writer(f, quotechar='"', quoting=csv.QUOTE_ALL) writer.writerow([msg]) messagebox.showinfo('Info', 'Message Saved!') scrollbar_tasks = Scrollbar(root) scrollbar_tasks.pack(side=RIGHT, fill=Y) listbox_tasks = Listbox(root, yscrollcommand=scrollbar_tasks.set, height=12, width=32, font=('Helvatica', 18)) listbox_tasks.pack(pady=20) entry = Entry(label_frame1, font=('Helvatica', 18)) entry.grid(row=0, column=1) my_create = Button(label_frame2, text='Add File', font=('Helvatica', 15), command=add_file) my_create.grid(row=0, column=0, pady=10, padx=10) my_entry = Button(label_frame2, text='Save File', bg='green', fg='#ffffff', font=('Helvatica', 15), command=lambda:save_file(msg)) my_entry.grid(row=1, column=0, pady=10, padx=10)
当我在输入框输入“1,Apple”并点击保存按钮后,CSV文件中显示为"1,Apple",而非预期的1,"Apple"。请问该如何修正此格式问题?
解决方案
问题核心在于你把整个输入字符串当成单个CSV字段写入了。CSV规范里,当字段包含逗号这类分隔符时,会自动用引号包裹整个字段,这是正常行为。但你想要的是把输入内容拆成两个独立字段,所以需要先拆分输入内容,再分别写入。
具体修正如下:
1. 修改保存逻辑,拆分输入字段
把输入的字符串按逗号分割成列表,再传入writerow;同时调整引号策略,让非数字字段自动加引号。另外建议去掉全局变量msg,直接从输入框或列表框获取内容,代码更健壮。
修正后的代码:
def add_file(): input_text = entry.get() if input_text != '': listbox_tasks.insert(END, input_text) entry.delete(0, END) else: messagebox.showinfo('Info', 'Please Fill In The Entry Box!') def save_file(): # 这里可以选择从输入框取内容,或者取列表框选中的项 input_text = entry.get() if not input_text: messagebox.showinfo('Info', 'Please Fill In The Entry Box!') return # 按逗号拆分字段,同时去除字段前后的空格 fields = [field.strip() for field in input_text.split(',')] with open('hello.csv', 'a', newline='') as f: # 使用QUOTE_NONNUMERIC,仅给非数字字段加引号 writer = csv.writer(f, quotechar='"', quoting=csv.QUOTE_NONNUMERIC) writer.writerow(fields) messagebox.showinfo('Info', 'Message Saved!') # ... 其余界面代码保持不变 ... # 修改保存按钮的command,无需传递全局变量 my_entry = Button(label_frame2, text='Save File', bg='green', fg='#ffffff', font=('Helvatica', 15), command=save_file) my_entry.grid(row=1, column=0, pady=10, padx=10)
关键说明
- 拆分字段:
input_text.split(',')把"1,Apple"拆成['1', 'Apple'],writerow会将其作为两个独立字段写入CSV。 - 引号策略:
csv.QUOTE_NONNUMERIC会自动识别数字和非数字字段,只给非数字的Apple加上引号,正好符合你要的1,"Apple"格式。 - 移除全局变量:直接从输入框获取内容,避免全局变量带来的潜在问题(比如多次输入后变量值混乱)。
这样修改后,输入"1,Apple"保存到CSV里就会显示为1,"Apple"了。
内容的提问来源于stack exchange,提问作者Loh Boon How
相关产品推荐
相关产品推荐

