列表到csv,在Python中不带逗号

列表到csv,在Python中不带逗号,python,csv,Python,Csv,我有以下问题。 我想将列表保存到csv中(在第一列中)。 请参见此处的示例: import csv mylist = ["Hallo", "der Pixer", "Glas", "Telefon", "Der Kühlschrank brach kaputt."] def list_na_csv(file, mylist): with open(file, "w&quo

我有以下问题。 我想将列表保存到csv中(在第一列中)。 请参见此处的示例:

import csv

mylist = ["Hallo", "der Pixer", "Glas", "Telefon", "Der Kühlschrank brach kaputt."]


def list_na_csv(file, mylist):

    with open(file, "w", newline="") as csv_file:
        csv_writer = csv.writer(csv_file)

        csv_writer.writerows(mylist)


list_na_csv("example.csv", mylist)
我在excel中的输出如下所示:

期望输出为:

你可以看到我有两个问题:第一,每个字符后面都有逗号。其次,我不知道如何使用一些编码,例如UTF-8或cp1250。我怎样才能修好它

我试图寻找类似的问题,但没有任何效果。多谢各位

l = ["Hallo", "der Pixer", "Glas", "Telefon", "Der Kühlschrank brach kaputt."]

with open("file.csv", "w") as msg:
    msg.write(",".join(l))
对于不那么琐碎的示例:

l = ["Hallo", "der, Pixer", "Glas", "Telefon", "Der Kühlschrank, brach kaputt."]

with open("file.csv", "w") as msg:
    msg.write(",".join([ '"'+x+'"' for x in l]))

这里您基本上在引号之间设置每个列表元素,以防止字段内逗号问题。

这里有两个问题

  • writerows
    需要一个行列表,换言之是一个iterables列表。由于字符串是可编辑的,所以将每个单词写在不同的行中,每个字段一个字符。如果希望一行中每个字段有一个单词,则应使用
    writerow

     csv_writer.writerow(mylist)
    
  • 默认情况下,csv模块使用逗号作为分隔符(这是最常见的分隔符)。但是Excel是一个让人头疼的东西:它希望分隔符是区域设置的一个,在许多西欧国家,包括德国,它是分号(
    )。如果要在Excel中轻松使用文件,应更改分隔符:

     csv_writer = csv.writer(csv_file, delimiter=';')
    

  • 编辑后,您需要第一列中的所有数据,每行一个元素。这是一种衰减的csv文件,因为它每个记录只有一个值,并且没有分隔符。如果字段不能包含分号或新行,则可以编写纯文本文件:

    ...
    with open(file, "w", newline="") as csv_file:
        for row in mylist:
            print(row, file=file)
    ...
    
    如果您希望安全并防止将来出现问题如果您以后想处理更多的角案例值,您仍然可以使用csv模块,通过将其包含在另一个iterable中,每行写入一个元素:

    ...
    with open(file, "w", newline="") as csv_file:
        csv_writer = csv.writer(csv_file, delimiter=';')
        csv_writer.writerows([elt] for elt in mylist)
        ...
    

    如果要将整个字符串列表写入一行,请使用注释中提到的
    csv\u writer.writerow(mylist)

    如果您想将每个字符串写入新行,正如我相信在第一列中引用写入它们所暗示的那样,您必须按照类的预期格式化数据:“一行必须是Writer对象的字符串或数字的iterable”。在这些数据上,看起来像:

    csv_writer.writerows((entry,) for entry in mylist)
    
    在这里,我使用一个生成器表达式将每个单词包装在一个元组中,从而使其成为一个字符串的iterable。如果没有类似的东西,字符串本身就是不可编辑的,并导致它在每个字符之间划界,如您所见

    使用csv为每行写入一个条目几乎毫无意义,但它的优点是,如果分隔符出现在数据中,它将跳出您的分隔符

    若要指定编码,请执行以下操作:

    由于open()用于打开CSV文件进行读取,因此该文件将 可以使用系统默认编码将默认值解码为unicode(请参阅 locale.getpreferredencoding()。使用不同的 编码,使用open的encoding参数:

    import csv with open('some.csv', newline='', encoding='utf-8') as f:
        reader = csv.reader(f)
        for row in reader:
            print(row)
    
    这同样适用于以系统默认编码以外的方式写入:在 打开输出文件


    试试这个,它能100%起作用

    import csv
    mylist = ["Hallo", "der Pixer", "Glas", "Telefon", "Der Kühlschrank brach kaputt."]
    def list_na_csv(file, mylist):
        with open(file, "w") as csv_file:
            csv_writer = csv.writer(csv_file)
            csv_writer.writerow(mylist)
    list_na_csv("example.csv", mylist)
    

    尝试writerow而不是writerow您是在寻找
    csv\u writer.writerow(mylist)
    ?这是用于实际数据的结构(每行一个字符串),还是只是一个简化的示例?如果它是您的真实数据-您尝试做的事情与仅将列表内容写入文件而不将其指定为CSV文件有何区别?由于每行有一个元素,所以没有什么可分离的。假设您实际上不想只将列表写入一行,在这种情况下,
    writerow()
    建议将解决您的主要问题。请注意,csv模块比单纯的连接要聪明得多。它确实支持字段中的换行符或分隔符,而您的答案不支持。这在这个简单的示例中有效,但在实际数据中会导致问题
    l=[“foo,bar”]
    将演示其中一个困难。我已经为逗号问题添加了一些支持。在我看来,当一个人不需要那些csv模块就可以制作时,他应该这样做。对于大多数情况,它们是一个黑匣子,我们不一定需要像csv这样简单的smth。使用标准库组件来覆盖各种不明显的特殊情况比自己尝试解决它们要好得多。@synthesis:对于不支持csv开箱即用的语言,我同意你的观点。但是Python自带电池,并且在其标准库中有很好的CSV支持。我真的很讨厌尝试发明一个或多或少的椭圆形轮子,当一个漂亮的圆形轮子免费提供的时候…谢谢你的回复,但在你的例子中,第一个单元格中的mylist元素被逗号烧焦了。这不是期望的输出。请看我上面编辑的问题。谢谢你的回复,但在你的例子中,第一行是mylist中的元素。这不是期望的输出。我需要在第一列中包含我的元素。请看我编辑的问题above@vojtam:只需查看我的编辑。我认为在后一种情况下,我仍然会指定分隔符,因为它与转义逻辑交互-包含分隔符的值被引用,至少在默认方言中是这样。因此,如果输入是
    [“foo,bar”,“foo;bar”]
    ,那么分隔符是
    还是
    即使每行只有一个条目。@PeterGlopper:你当然是对的!后编辑…谢谢你的回复。您的解决方案
    csv\u writerows(mylist中条目的元组(条目)
    给出了相同的结果。每个字符用逗号分隔。例如d、e、r、P、i、x、e、r等。当然,iterable上的
    tuple
    会将iterable转换为其元素的元组,而不仅仅是iterable的元组
    writerows((entry,)代表mylist中的entry)
    可以工作-这基本上与公认的答案做相同的事情。