首页 > 解决方案 > Python csv阅读器忽略作为字符串一部分的双引号内的分隔符

问题描述

如果我有一个字符串

s = 'some data in here, some more data in here, 0, a string|12345|"today,tomorrow-nextweek 6a-10a"|1234567, 2, 3.4, data string, string'

我如何阅读它,结果是这样的?

['some data in here',
 'some more data in here',
 '0',
 'a string|12345|"today,tomorrow-nextweek 6a-10a"|1234567',
 '2',
 '3.4',
 'data string',
 'string']

该元素'a string|12345|"today,tomorrow-nextweek 6a-10a"|1234567'不断被 csv 阅读器分成两个元素,因为在分隔符之间有双引号和另一个分隔符。我不确定是否有办法用 csv.reader 解决这个问题。我已经在字符串上尝试了以下内容,但无济于事

next(csv.reader(StringIO(s), quoting=csv.QUOTE_ALL, skipinitialspace=True))

next(csv.reader(StringIO(s), skipinitialspace=True))

next(csv.reader(StringIO(s), doublequote=True, quoting=csv.QUOTE_NONE, escapechar='\\', skipinitialspace=True))

标签: pythoncsv

解决方案


csv这对于模块支持的方言是不可能的。您可以改为使用re.findall匹配双引号字符串或非逗号字符的重复的交替模式,并使用前面的正向前瞻模式来确保匹配以非空格开头:

import re
re.findall(r'(?=\S)(?:"[^"]*"|[^,])+', s)

演示:https ://repl.it/@blhsing/SplendidRichPyramid


推荐阅读