使用Python在CSV文件中向单元格写入带逗号的文本
我想在CSV文件的一个单元格里写入带逗号的文本。
输入内容
'1,2,3,Hello'
在CSV文件中的输出应该是
'1,2,3','Hello'
3 个回答
6
文件中的每一行都是一条数据记录。每条记录由一个或多个字段组成,字段之间用逗号分隔。
用逗号来分隔字段的基本想法很简单,但当字段的数据中也可能包含逗号或者换行符时,这个想法就变得复杂了。
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'
9
这不是专门针对Python的,而是关于CSV“标准”的内容。
如果你想在你的值里面写一个控制字符,你需要用双引号把这个值包起来,这样才能正确处理:
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写入接口会更好。因为如果有现成的库可以帮你处理这些细节,就没必要自己去纠结这些实现细节了。
30
使用合适的 CSV 写入工具:
>>> import csv
>>> spamWriter = csv.writer(open('eggs.csv', 'wb'))
>>> spamWriter.writerow(['Spam', 'Lovely, Spam'])
输出结果:
Spam,"Lovely, Spam"