You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 23:12:28