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

2024-06-25 22:50:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图从一个我无法控制的外部系统解析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模块来解析它吗?


Tags: 模块文件csv示例系统字符引号reader
2条回答

接下来是@JackManey注释,他建议用'\\"'替换双引号中'""'的所有实例。

如果我们现在在双引号的单元格中,就没有必要识别,我们可以用'\\"'替换'""'的所有实例。 Python documentation says

On reading, the escapechar removes any special meaning from the following character

但是,如果原始单元格已经包含转义字符,则仍然会出现这种情况,例如:'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]

正如@JackManey所建议的,在读取文件之后,可以用一个双引号替换两个双引号。

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

相关问题 更多 >