使用Python在CSV文件中向单元格写入带逗号的文本

21 投票
3 回答
57279 浏览
提问于 2025-04-16 02:44

我想在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"

撰写回答