我试图解析我无法控制的外部系统中的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模块解析它?
答案 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]