【发布时间】:2011-03-29 09:34:33
【问题描述】:
我想将带逗号的文本写入 CSV 文件中的单元格。
输入
'1,2,3,Hello'
CSV 中的输出应该是
'1,2,3','Hello'
【问题讨论】:
我想将带逗号的文本写入 CSV 文件中的单元格。
输入
'1,2,3,Hello'
CSV 中的输出应该是
'1,2,3','Hello'
【问题讨论】:
这不是 Python 特有的,而是与 CSV "standard" 有关。
如果你想写一个控制字符作为你的值的一部分,你需要用双引号括起来来转义这个值:
f.write('1,2,3,45,"The Next comma I want to write and not separate to another cell, so this sentence will be whole",6,7,8')
编辑:尽管在实践中,使用其他人建议的 CSV 编写器接口会更好。当有一个现成的库可以为您抽象出来时,将自己卷入实现细节绝不是一个好主意。
【讨论】:
print 不同,write 方法不会为您提供一个。
文件的每一行都是一个数据记录。每条记录由一个或多个字段组成,以逗号分隔。
用逗号分隔字段的基本思想很明确,但是当字段数据也可能包含逗号甚至嵌入换行符时,这个想法就会变得复杂。
CSV 实现可能无法处理此类字段数据,或者它们可能使用引号将字段括起来。 -- 来自https://en.wikipedia.org/wiki/Comma-separated_values
因此您可以使用引号将每个字段文本括起来。
假设输入是['1,2,3', 'Hello'],输出到CSV应该是"1,2,3", "Hello",你可以使用下面的代码来实现。
>>> ",".join('"{0}"'.format(s) for s in ['1,2,3', 'Hello'])
'"1,2,3","Hello"'
但是当文本中有"、\n等特殊符号时,你会遇到问题。
python csv 库已经为您处理了所有边缘情况。
可以使用@Dominic Rodger 回答。
>>> import csv
>>> spamWriter = csv.writer(open('eggs.csv', 'wb'))
>>> spamWriter.writerow(['Spam', 'Lovely, Spam'])
来自https://stackoverflow.com/a/9157370/5238892。
在 Python 3 中:
>>> import io
>>> import csv
>>> output = io.StringIO()
>>> csvdata = [1,2,'a','He said "what do you mean?"',"Whoa!\nNewlines!"]
>>> writer = csv.writer(output, quoting=csv.QUOTE_NONNUMERIC)
>>> writer.writerow(csvdata)
59
>>> output.getvalue()
'1,2,"a","He said ""what do you mean?""","Whoa!\nNewlines!"\r\n'
Python 2 的一些细节需要稍作改动:
>>> output = io.BytesIO()
>>> writer = csv.writer(output)
>>> writer.writerow(csvdata)
57L
>>> output.getvalue()
'1,2,a,"He said ""what do you mean?""","Whoa!\nNewlines!"\r\n'
【讨论】:
使用正确的CSV writers:
>>> import csv
>>> spamWriter = csv.writer(open('eggs.csv', 'wb'))
>>> spamWriter.writerow(['Spam', 'Lovely, Spam'])
输出:
垃圾邮件,“可爱,垃圾邮件”
【讨论】:
'Spam,"Lovely, Spam"\r\r\n'