【问题标题】:Python CSV writer, how to handle quotes in order to avoid triple quotes in outputPython CSV writer,如何处理引号以避免输出中的三引号
【发布时间】:2014-07-29 20:03:01
【问题描述】:

我正在使用 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 方言有关,我希望避免深入研究。

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

【问题讨论】:

  • 以这种方式编写输出是生成有效 CSV 的一部分,该 CSV 以您指定的方式表示您的数据。生成一个无效的 CSV 文件(或者当您传入引号作为数据时写入引号作为语法的文件)将是一个错误,而不是一项功能。
  • 想要它是什么样子的?您还想与哪些其他 CSV 处理代码进行互操作? (如果您正在创建要输入 Excel 或 np.loadtxt 或其他任何内容的文件,您的输出最好能被其他程序读取。)
  • 现有答案涵盖了它,但要完全清楚,值得注意的是,如果您使用csv.reader 重新读取输出,您将获得带引号的原始字符串。试试看。
  • @JasonS:好点;我可能不需要打开 Excel 或 np.loadtxt;您想要与之互操作的最常见的东西是您自己的代码。 :)
  • 我试图让它与其他软件互操作,但不想弄脏水。我也试图了解发生了什么(但想问一个具体的可回答的问题)。万一其他人偶然发现这一点,如果您对与其他程序更好的互操作性感兴趣,请谷歌搜索“schema.ini”和“csvt 文件扩展名”(解决了我的最终问题,但下面的答案仍然有帮助)

标签: python csv


【解决方案1】:

实际上并不是三引号,虽然看起来是这样。用另一个例子试试看:

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

现在你会看到它是这样写的:

"abc""def"

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

问题是,你想要什么格式?几乎任何你想要的东西(在合理范围内)都是可行的,但你必须选择一些东西。反斜杠转义引号?反斜杠转义所有内容而不是首先使用引号?单引号代替双引号?

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

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

...直到你有一个像Filet O'Fish 这样的项目并且整个事情被单引号和' 加倍并且你遇到了你试图避免的完全相同的问题。如果您的目标是提高人类可读性,而 ' 在您的数据中比 " 少得多,那么这实际上可能是正确的答案,但它并不是一个完美的答案。

真的,没有一个答案是完美的:你需要一些方法来引用或转义逗号——以及其他东西,比如换行——你这样做的方式将至少添加一个需要引用的字符- 翻倍或逃脱。如果您知道数据中从来没有任何逗号、换行符等,并且至少有一个您知道永远不会出现的其他字符,您可以将quotechar 设置为该其他字符或escapechar。给那个其他角色和quoting=QUOTE_NONE。但是第一次有人意外使用了你确定不会出现的字符时,你的代码就会出错,所以你最好确定一下。

【讨论】:

  • 只是补充一下,以防其他人在将来发现这很有用:我尝试根据这个答案设置 quotechar=" " (是的,在实践中可能很愚蠢,但试图理解这里的行为)并得到了我想要的输出:'item1,"01",001,1'(我没有意识到默认行为是使用双引号作为转义字符,我认为它正在转换为 python 三引号方法指定一个字符串)
  • @RichardW:不是默认使用双引号作为转义字符,而是默认使用引号而不是转义,使用双引号作为引号字符,也就是说每个引号字符都必须与字符串的其余部分分开引用……这似乎是一个奇怪的设计,但它可能可以追溯到几十年前的 Excel 1.0 试图几乎像 Lotus 但有一些细微差别以避免潜在的 IP 声明…
  • 这是启蒙的时刻。 quotechar 的含义不是人们凭直觉就能理解的。 (也是 csv.QUOTE_NONE)
【解决方案2】:

引号会被转义,因为您的数据可能包含逗号。如果您不想转义引号,您可能不需要 CSV 文件。只需加入逗号(如果您的数据中有逗号,这将中断下游)

【讨论】:

    猜你喜欢
    • 2016-02-09
    • 2015-09-08
    • 2014-07-15
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    • 1970-01-01
    • 2011-07-04
    相关资源
    最近更新 更多