我正在使用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方言有关,我希望避免过多地挖掘它。
回想起来,我可能已经构建了我的初始数据集,并且可能避免了这种情况的需要,但此时好奇心真的越来越好了(这是一个简化的例子):你如何保持书面输出从添加这些额外的报价?
答案 0 :(得分:8)
它实际上并不是三重引用,尽管看起来就是这样。尝试使用其他示例来查看:
test = ['item1', 'abc"def']
现在你会看到它写道:
"abc""def"
换句话说,它只是在你的字符串周围包装引号,并通过将它们加倍来转义字面引号字符,因为这是Excel格式的CSV处理引号字符的默认方式。
问题是,你想要什么格式做?几乎任何你想要的东西(在合理范围内)都是可行的,但你必须选择一些东西。反斜杠逃避报价?反斜杠 - 逃避一切而不是首先使用引号?单引号而不是双引号?
例如,这看起来像一个答案:
csvOut = csv.writer(open('file.txt','a'), quotechar="'")
...直到你有一个像Filet O'Fish
这样的项目并且整个内容被单引号并且'
加倍并且你有完全相同的问题,你试图避免。如果您的目标是人类可读性,而'
在您的数据中比"
少得多,那实际上可能是正确的答案,但它并不是一个完美的答案
实际上,没有答案可以是完美的:你需要一些方法来引用或逃避逗号 - 以及其他东西,比如换行符 - 你这样做的方式是至少增加一个需要引用的字符 - 加倍或逃脱。如果您知道数据中没有任何逗号,换行符等,并且至少还有一个您知道的其他角色永远不会出现,那么您可以将quotechar
设置为其他角色字符,或escapechar
到其他字符和quoting=QUOTE_NONE
。但是第一次出人意料地使用你确定永远不会出现的角色时,你的代码就会破裂,所以你确实更加确定。
答案 1 :(得分:0)
报价被转义,因为您的数据可能包含逗号。如果您不希望转义报价,则可能不需要CSV文件。只需加入一个逗号(如果你的数据中有逗号,这将打破下游)