将列表转换为csv但数据有','在里面

时间:2014-10-19 17:37:27

标签: python list python-3.x

我想将列表转换为csv,但有些数据是','在他们中。所以当我写

with open('out.csv', 'w') as fp:
    writer = csv.writer(fp,delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL, lineterminator='\n')
    writer.writerows(elements)

元素是我的列表名称,数据包含","被发送到下一列,但它是单个名称的一部分。对于Eg。 Smith, CA. SO CA移动到下一列。 我该怎么办?

4 个答案:

答案 0 :(得分:3)

首先,您应该使用newline=''参数打开文件(阅读csv module的文档)。

然后,选择"作为引号字符,以便其他期望引号的CSV工具(Excel?)可以对您的文件做出正确反应:

with open('out.csv', 'w', newline='') as fp:
    writer = csv.writer(fp, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL, lineterminator='\n')
    writer.writerows(elements)

答案 1 :(得分:0)

使用csv.QUOTE_ALL

来自documentation

csv.QUOTE_ALL
Instructs writer objects to quote all fields.

如果使用特殊引号char,则用于读取csv的应用程序需要配置为将其用作引号char

答案 2 :(得分:0)

这是一个有效的例子,但请注意,如果有人评论,这在Excel中无法读取。

import csv

elements = [['Last1, First1','City, State',12345,'111-22-3333','Embedded|Quote'],
            ['Last2, First2','City, State',12345,'111-22-3333','Embedded|Quote'],
            ['Last3, First3','City, State',12345,'111-22-3333','Embedded|Quote'],
            ['Last4, First4','City, State',12345,'111-22-3333','Embedded|Quote']]

with open('out.csv', 'w', newline='') as fp:
    writer = csv.writer(fp,delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL, lineterminator='\n')
    writer.writerows(elements)

with open('out.csv') as fp:
    print(fp.read())

with open('out.csv', 'r', newline='') as fp:
    reader = csv.reader(fp, quotechar='|')
    for line in reader:
        print(line)

输出:

|Last1, First1|,|City, State|,12345,111-22-3333,|Embedded||Quote|
|Last2, First2|,|City, State|,12345,111-22-3333,|Embedded||Quote|
|Last3, First3|,|City, State|,12345,111-22-3333,|Embedded||Quote|
|Last4, First4|,|City, State|,12345,111-22-3333,|Embedded||Quote|

['Last1, First1', 'City, State', '12345', '111-22-3333', 'Embedded|Quote']
['Last2, First2', 'City, State', '12345', '111-22-3333', 'Embedded|Quote']
['Last3, First3', 'City, State', '12345', '111-22-3333', 'Embedded|Quote']
['Last4, First4', 'City, State', '12345', '111-22-3333', 'Embedded|Quote']

如果您确实要在Excel中打开.csv文件,请使用默认的dialect参数。您encoding='utf-8-sig'也支持非ASCII字符,并提供Excel正确读取.csv所需的字节顺序标记(BOM)签名:

#! coding=utf8
import csv

elements = [['Last1, First1','City, State',12345,'111-22-3333','Embedded"Quote'],
            ['多路能, 马克','City, State',12345,'111-22-3333','Embedded"Quote'],
            ['Last3, First3','City, State',12345,'111-22-3333','Embedded"Quote'],
            ['Last4, First4','City, State',12345,'111-22-3333','Embedded"Quote']]

with open('out.csv', 'w', encoding='utf-8-sig', newline='') as fp:
    writer = csv.writer(fp)
    writer.writerows(elements)

with open('out.csv','rb') as fp:
    print(fp.read().decode())

with open('out.csv', 'r', encoding='utf-8-sig', newline='') as fp:
    reader = csv.reader(fp)
    for line in reader:
        print(line)

输出:

"Last1, First1","City, State",12345,111-22-3333,"Embedded""Quote"
"多路能, 马克","City, State",12345,111-22-3333,"Embedded""Quote"
"Last3, First3","City, State",12345,111-22-3333,"Embedded""Quote"
"Last4, First4","City, State",12345,111-22-3333,"Embedded""Quote"

['Last1, First1', 'City, State', '12345', '111-22-3333', 'Embedded"Quote']
['多路能, 马克', 'City, State', '12345', '111-22-3333', 'Embedded"Quote']
['Last3, First3', 'City, State', '12345', '111-22-3333', 'Embedded"Quote']
['Last4, First4', 'City, State', '12345', '111-22-3333', 'Embedded"Quote']

答案 3 :(得分:0)

将自动引用必须引用的值。例如,如果您使用,作为分隔符,则必须引用值“Smith,CA”,因为它包含,

您的问题没有说明elements变量的外观,所以我在这里猜测。如果你有一个可迭代的元素,每个元素看起来像['Smith, CA', 1, someothervalue],你发布的代码就可以了。我按如下方式完成了您的代码示例:

import csv

elements = [['Smith, CA', 1, 'salad'], ['Doe, NY', 2, 'soup']]

with open('out.csv', 'w') as fp:
    writer = csv.writer(fp, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL, lineterminator='\n')
    writer.writerows(elements)

它将产生以下输出:

|Smith, CA|,1,salad
|Doe, NY|,2,soup

注1:由于您使用的是quoting=csv.QUOTE_MINIMAL,因此只会引用需要的值。其他值如1'salad'未引用。

注2:使用|作为quotechar并不常见,正如@TimPietzcker所指出的那样。但它确实有效。