【问题标题】:Writing to csv puts quotes around quotes and quotes around entire cell写入 csv 在引号周围加上引号,在整个单元格周围加上引号
【发布时间】:2021-02-06 07:46:09
【问题描述】:

我正在尝试将数组写入 csv,但如果数组单元格中有双引号,它会添加如下引号:

数组中的示例数据:快速的棕色“狐狸”跳跃

csv 中的相同数据:“The quick brown ""fox"" jumps"

如果第一部分用这样的引号括起来:“The quick” brown fox jumps,它会做同样的事情:“”“The quick”“ brown fox jumps”。所以它是在有引号的部分周围添加引号,然后在整个单元格内容周围添加引号。

这是我写入 csv 的代码:

matrix = populateArray()
with open('phrases.csv', 'w', encoding='utf-8', newline='') as f:
    thewriter = csv.writer(f)
    for x in range(0,1):
        print(matrix[x])
        thewriter.writerow(matrix[x])

print(matrix[x]) 的输出是:

['The "quick" brown fox jumps', 'Lorem ipsum']

因此,您可以直接看到数据在写入 csv 之前已正确格式化,但在实际写入 csv 期间,它会添加如上所述的额外引号。

非常感谢任何帮助。 谢谢

【问题讨论】:

  • 双引号在 CSV 文件中意味着一些特殊的东西。 csvwriter 将第一轮 " 添加为两轮,因为这就是 CSV 标准中引号的转义方式。当你用相应的阅读器读回它时,它将与matrix[x] 相同。如果您更改此行为,您的输出 CSV 文件可能无法读取您编写的相同字符串

标签: python csv


【解决方案1】:

这应该可以解决问题:

with open('phrases.csv', 'w', encoding='utf-8', newline='') as f:
    thewriter = csv.writer(f, quoting=csv.QUOTE_NONE, escapechar='\\')
    for x in range(0,1):
        print(matrix[x])
        thewriter.writerow(matrix[x])

您需要指定作者不应生成额外的引号 (quoting=csv.QUOTE_NONE):

Dialect.quoting

控制作者何时应生成引号 并得到读者的认可。它可以采用任何QUOTE_* 常量(参见模块内容部分),默认为QUOTE_MINIMAL

可能还需要指定escaprechar

Dialect.escapechar

作者用来转义的单字符字符串 分隔符如果引用设置为 QUOTE_NONE 和 quotechar if 双引号是假的。在阅读时,escapechar 会删除任何特殊的 从下面的字符的意思。它默认为无,即 禁止转义。

【讨论】:

  • 谢谢。我刚试了一下,它说:'quoting' 是 open() 的无效关键字参数。我检查了 python 文档,它没有提到任何关于引用的内容。有什么想法吗?
  • 不使用上下文管理器时,应单独打开文件,完成后关闭。无论如何,在打开 csv 时,您应该指定“newline=''`(请参阅 csv 文档)。
  • @martineau 同意。我还是删除了它,因为上下文管理器更方便。
  • @giorgos-myrianthous 感谢更新的答案。那行得通,但确实给了我错误:需要转义,但没有设置转义字符。我添加了escapechar='\\',然后运行没有错误,但现在在每个引用之前都带有一个“\”。我认为这不会像@MarkPflug 回答所解释的那样给我带来问题?
  • @user2382321 没错 - 我错过了escaprechar
【解决方案2】:

根据 RFC-4180 标准,这是正确的: https://www.rfc-editor.org/rfc/rfc4180#page-2

解释一下:引号放在包含分隔符的字段周围。包含逗号的字段周围会有引号,因此表示整个引用文本是字段,包含的逗号是值的一部分,不应被解释为字段分隔符。但是,这意味着引号也会成为问题,因为您将如何表示以引号开头的字段?您必须转义引号,这是通过将它们加倍来完成的。

此处理必须能够明确地读取输入值及其嵌入的逗号和引号。

正确实现的 CSV 库应该重现您写入的原始值,即使 CSV 中的表示看起来不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-18
    • 2015-02-17
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 2017-10-07
    相关资源
    最近更新 更多