我想将列表转换为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移动到下一列。
我该怎么办?
答案 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
。
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所指出的那样。但它确实有效。