Python CSV编写器,如何处理引号以避免输出中的三重引号

我正在使用
Python的CSV模块,特别是编写器.我的问题是如何将双引号添加到列表中的单个项目并让编写器以与print语句相同的方式编写字符串?

例如:

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方言有关,我希望避免过多地挖掘它.

回想起来,我可能已经构建了我的初始数据集,并且可能避免了这种情况的需要,但此时好奇心真的让我变得更好(这是一个简化的例子):你如何保持书面输出不添加这些额外的报价?

最佳答案 它实际上并不是三重引用,尽管看起来就是这样.尝试使用另一个示例来查看:

test = ['item1', 'abc"def']

现在你会看到它写道:

"abc""def"

换句话说,它只是在你的字符串周围包装引号,并通过将它们加倍来转义字面引号字符,因为这是Excel样式CSV处理引号字符的默认方式.

问题是,你想要什么格式?几乎任何你想要的东西(在合理范围内)都是可行的,但你必须选择一些东西.反斜杠逃避报价?反斜杠 – 逃避一切而不是首先使用引号?单引号而不是双引号?

例如,这看起来像一个答案:

csvOut = csv.writer(open('file.txt','a'), quotechar="'")

…直到你有一个像Filet O’Fish这样的项目,并且整个事情都被单引号并且’加倍并且你有完全相同的问题,你试图避免.如果你的目标是人类的可读性,并且’在你的数据中不太常见“,那实际上可能是正确的答案,但它并不是一个完美的答案.

实际上,没有答案是完美的:你需要一些方法来引用或逃避逗号 – 以及其他东西,比如换行符 – 你这样做的方式是至少增加一个需要引用加倍的字符或逃过一劫.如果你知道你的数据中从来没有任何逗号,换行符等,并且至少还有一个你知道的其他角色永远不会出现,那么你可以将quotechar设置为另一个角色,或者将escapechar设置为其他角色和quoting = QUOTE_NONE.但是第一次有人意外地使用了你确定永远不会出现的角色,你的代码就会崩溃,所以你最好确定一下.

点赞