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

mat*_*atf 5 python csv

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

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

示例CSV:

QW "" erty, "A" "B" "C" "d,EF" "" "克"

应解析为:

[['qw"erty', 'a"b"c"d,ef""g']]
Run Code Online (Sandbox Code Playgroud)

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

['qw""erty', 'a"b"c"d,ef""g']
Run Code Online (Sandbox Code Playgroud)

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

mat*_*atf 5

继@JackManey评论后,他建议用'""'双引号替换所有双引号实例'\\"'.

认识到,如果我们现在是双引号细胞内竟然是不必要的,我们可以更换的所有实例'""''\\"'. Python文档说:

在阅读时,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]
Run Code Online (Sandbox Code Playgroud)