如何使用csv模块处理字段值内的双引号?

时间:2015-02-25 17:39:18

标签: python csv

我试图解析我无法控制的外部系统中的CSV文件。

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

示例CSV:

  

QW"" erty,""" B"" C"" d,EF"&#34 ;"" 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模块解析它?

2 个答案:

答案 0 :(得分:5)

关注@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]

答案 1 :(得分:0)

正如@JackManey建议的那样,在阅读完文件后,你可以用双引号替换两双引号。

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