在Python中,列表格式为csv,不带逗号

2ekbmq32  于 2022-12-06  发布在  Python
关注(0)|答案(5)|浏览(183)

我有以下问题。我想保存一个列表到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或cp 1250。请问我该如何修正?
我试着搜索类似的问题,但没有为我工作。谢谢。

wlwcrazw

wlwcrazw1#

你有两个问题。

  1. writerows需要一个行列表,也就是可迭代列表。因为字符串是可迭代的,所以每个单词都写在不同的行中,每个字段一个字符。如果你想要一行中每个字段一个单词,你应该使用writerow
csv_writer.writerow(mylist)

1.默认情况下,csv模块使用逗号作为分隔符(这是最常见的一种)。2但是Excel使用它是一件麻烦事:它要求分隔符为区域设置的分隔符,在许多西欧国家(包括德国),区域设置为分号(;)。如果您希望在 your 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模块,并通过将每行包含在另一个可迭代对象中来写入一个元素:

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

uyhoqukh2#

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]))

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

g52tjvyc

g52tjvyc3#

试试这个,它会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)
mznpcxlj

mznpcxlj4#

如果要将整个字符串列表写入一行,请使用注解中提到的csv_writer.writerow(mylist)
如果你想把每个字符串写入一个新的行,正如我相信你在第一列中提到的那样,你必须按照类的要求格式化你的数据:“对于Writer对象,行必须是字符串或数字的可迭代对象”。在此数据上,将类似于:

csv_writer.writerows((entry,) for entry in mylist)

在这里,我使用一个生成器表达式将每个单词 Package 在一个元组中,从而使它成为一个字符串的可迭代对象。如果没有这样的东西,你的字符串本身就是可迭代的,并导致它在每个字符之间划界,正如你所看到的。
使用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)

这同样适用于使用系统默认编码以外的其他编码进行写入:请在打开输出文件时指定编码参数。

doinxwow

doinxwow5#

尝试拆分(“\n”)示例:

counter = 0
amazing list = ["hello","hi"]
for x in titles:
        ok = amazinglist[counter].split("\n")
        writer.writerow(ok)
        counter +=1

相关问题