如何从导入到组合框的 csv 文件中删除大括号?

How do I remove Curly Brackets from csv file imported to combobox?

这是我第一次玩 Python,我对将条目导入组合框的 csv 文件有点问题。本质上,任何超过一个词的条目都被大括号括起来。我不确定为什么会这样,也不知道如何解决这个问题。谁能帮我解释一下这个问题(请用简单的英语 ;))。我已经阅读了一些关于字符串和连接的内容,但老实说,这让我很困惑。

owner_var = tk.StringVar()
with open('C:/Users/Me/Desktop/Test/Sample.csv', encoding='utf-8-sig') as csv_file:
csv_reader = csv.reader(csv_file)
data = list(csv_reader)
owner_drop_down = ttk.Combobox(master, state='readonly', values=data, textvariable=owner_var, font="Verdana 12").place(x=750, y=300, height=30, width=280)

我的 CSV 是这样写的
A 列
丹尼
彼得
马克斯·史密斯
约翰·登特
安德鲁

它打印成这样
打印 [['Danny'], ['Peter'], ['Max Smith'], ['John Dent'], ['Andrew']]

但是我在输出中得到的结果是这样的
丹尼
彼得
{马克斯·史密斯}
{约翰·登特}
安德鲁

任何人都可以向我解释发生了什么,我该如何解决这个问题?

尝试以下操作 - 代码逐行读取第 1 行并将它们收集在列表中。因为我们不需要第一行,所以我们跳过它 ([1:])

with open('my.csv') as f:
  words = [w.strip() for w in f.readlines()][1:]
  print(words)

my.csv

Column A
Danny
Peter
Max Smith
John Dent
Andrew

输出

['Danny', 'Peter', 'Max Smith', 'John Dent', 'Andrew']

如果您的 csv 文件包含单列,您可以逐行阅读它。

data = []
with open(r"C:\Users\Me\Desktop\Test\Sample.csv") as file:
    for line in file:
        data.append(line)

print(data)

它会给你下一个输出:

['Column A\n', 'Danny\n', 'Peter\n', 'Max Smith\n', 'John Dent\n', 'Andrew']

如您所见,此输出有两个问题:

  1. CSV header不被跳过;
  2. 每个字符串 (最后一个除外) 包含尾随 \n.

引自 open() 的文档:

Open file and return a corresponding file object.

python 教程的 Reading and Writing Files 部分还有一个:

For reading lines from a file, you can loop over the file object. This is memory efficient, fast, and leads to simple code.

据此我们可以假设 file object is an iterator. To solve first problem we need to skip first item of file object (iterator). We can use built-in function next():

data = []
with open(r"C:\Users\Me\Desktop\Test\Sample.csv") as file:
    next(file)  # skip first line
    for line in file:
        data.append(line)

print(data)

它将给我们下一个输出:

['Danny\n', 'Peter\n', 'Max Smith\n', 'John Dent\n', 'Andrew']

此解决方案只有一个问题。引自 next() 文档:

If default is given, it is returned if the iterator is exhausted, otherwise StopIteration is raised.

这意味着如果输入文件为空并且我们不会传递 default 参数,我们将得到一个异常。解决方案很明显,只需添加 default 参数。

要解决尾随 \n 的问题,我们可以应用 str.rstrip(). If we don't pass any arguments to str.rstrip() it will remove all whitespaces。代码:

data = []
with open(r"C:\Users\Me\Desktop\Test\Sample.csv") as file:
    next(file, None)  # added default value
    for line in file:
        data.append(line.rstrip())  # added str.rstrip()

print(data)

它将给我们正确的输出:

['Danny', 'Peter', 'Max Smith', 'John Dent', 'Andrew']

您可以使用 list comprehension 来缩短此代码:

with open(r"C:\Users\Me\Desktop\Test\Sample.csv") as file:
    next(file, None)
    data = [line.rstrip() for line in file]

print(data)

或者你可以做得更短:

with open(r"C:\Users\Me\Desktop\Test\Sample.csv") as file:
    data = [line.rstrip() for line in next(file, True) and file]

print(data)