Python CSV写入器,如何处理引号以避免输出中出现三个引号
我正在使用Python的CSV模块,特别是里面的写入功能。我的问题是,如何给列表中的某个项目加上双引号,并让写入功能输出的字符串和打印语句的效果一样呢?
比如说:
import csv
#test "data"
test = ['item1','01','001',1]
csvOut = csv.writer(open('file.txt','a')) #'a' used for keeping past results
test[1] = '"'+test[1]+'"'
print test
#prints: ['item1', '"01"', '001', 1]
csvOut.writerow(test)
#written in the output file: item1,"""01""",001,1
#I was expecting: item1,"01",001,1
del csvOut
我尝试添加一个quoting=csv.QUOTE_NONE的选项,但这引发了一个错误。我猜这和CSV的多种格式有关,我希望能避免深入研究这个问题。
回想起来,我可能可以更聪明地构建我的初始数据集,或许就能避免这种情况的发生,但此刻我的好奇心真的占了上风(这是一个简化的例子):怎么才能让输出时不添加那些多余的引号呢?
2 个回答
引号会被转义是因为你的数据可能包含逗号。如果你不想让引号被转义,那你可能就不想要一个CSV文件。你只需要用逗号连接数据(但如果你的数据里有逗号,这样做会出问题)。
其实这并不是三重引号,虽然看起来像。你可以试试其他例子来看看:
test = ['item1', 'abc"def']
现在你会看到它写成这样:
"abc""def"
换句话说,它只是把引号包裹在你的字符串周围,并通过把引号字符加倍来转义,因为这就是默认的Excel风格CSV处理引号字符的方式。
问题是,你想要什么格式呢?几乎任何你想要的格式(在合理范围内)都是可以的,但你必须选择一种。是用反斜杠转义引号?还是用反斜杠转义所有东西,而不是一开始就用引号?用单引号而不是双引号呢?
例如,这看起来像是一个答案:
csvOut = csv.writer(open('file.txt','a'), quotechar="'")
……直到你有一个像Filet O'Fish
这样的项目,整个字符串都被单引号包围,那个'
又被加倍了,这样你就又遇到了你想避免的同样问题。如果你想让人类更容易阅读,而'
在你的数据中出现得远不如"
常见,那这可能是个不错的选择,但它并不是完美的答案。
实际上,没有哪个答案是完美的:你需要某种方式来引用或转义逗号——还有其他东西,比如换行符——而你这样做会至少增加一个需要被加倍或转义的字符。如果你知道你的数据中绝对不会有逗号、换行符等,并且至少有一个你知道永远不会出现的其他字符,你可以把quotechar
设置为那个其他字符,或者把escapechar
设置为那个其他字符,并且quoting=QUOTE_NONE
。但如果第一次有人意外使用了你原本认为不会出现的字符,你的代码就会崩溃,所以你最好真的确认一下。