【问题标题】:How to handle double quotes inside field values with csv module?如何使用 csv 模块处理字段值内的双引号?
【发布时间】:2015-04-27 20:28:08
【问题描述】:

我正在尝试从我无法控制的外部系统解析 CSV 文件。

  • 逗号用作分隔符
  • 当单元格包含逗号时,它会用引号括起来,所有其他引号都用另一个引号字符转义。
  • (我的问题)当单元格没有用引号括起来时,所有引号字符都会用另一个引号转义。

CSV 示例:

qw""erty,"a""b""c""d,ef""""g"

应该被解析为:

[['qw"erty', 'a"b"c"d,ef""g']]

但是,我认为 Python 的 csv 模块不希望首先在单元格未包含在引号字符中时转义引号字符。 csv.reader(my_file)(默认为doublequote=True)返回:

['qw""erty', 'a"b"c"d,ef""g']

有没有办法用 python csv 模块解析这个?

【问题讨论】:

  • 为什么不用'\\"' 替换双引号内的所有'""' 实例?那么csv阅读器应该可以正常工作了。
  • 你的引号字符和转义字符是一样的吗?
  • @JackManey“双引号内”片段是不必要的,但总的来说,我认为只要我也转义所有“\”字符,它就会起作用。

标签: python csv


【解决方案1】:

在@JackManey 评论之后,他建议将双引号内的所有'""' 实例替换为'\\"'

识别我们当前是否在双引号单元内被证明是不必要的,我们可以用'\\"' 替换所有'""' 实例。 Python documentation says:

在阅读时,escapechar 会从后面的字符中删除任何特殊含义

但是,在原始单元格已经包含转义字符的情况下,这仍然会中断,例如:'qw\\\\""erty' 生成 [['qw\\"erty']]。所以我们也必须在解析之前对转义字符进行转义。

最终解决方案:

with open(file_path, 'rb') as f:
  content = f.read().replace('\\', '\\\\').replace('""', '\\"')
  reader = csv.reader(StringIO(content), doublequote=False, escapechar='\\')
  return [row for row in reader]

【讨论】:

    【解决方案2】:

    正如@JackManey 建议的那样,在阅读文件后,您可以将两个双引号替换为单双引号。

    my_file_onequote = [col.replace('""', '"') for col in row for row in my_file]
    

    【讨论】:

    • 这将失败,"ab""cd,ef" 返回 2 个单元格,但我认为 @JackManey 几乎是正确的。
    猜你喜欢
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    相关资源
    最近更新 更多