2015-06-11 50 views
2

我试图解析简单的字符串的csv模块:CSV在python解析用引号值

s='param="(a, b)", param2, param3' 
list(csv.reader([s], skipinitialspace=True)) 

它拆分到

[['param="(a', 'b)"', 'param2', 'param3']]

,但我想获得

[['param="(a, b)"', 'param2', 'param3']]

似乎为CSV模块引用的文本可能只是整个服用者。

如何使我想要的东西正确?

注意:这不是Splitting with commas的重复,因为在这种情况下,每个字段不是引用的,只是字段内的一部分。在该链接上发布的答案(以及问题重复的链接)不适用于这种情况,正如上述代码所证明的那样(它重新创建与发布的答案相同的结构,并且显示它失败)。

+1

不确定在OP的问题没有被该问题回答时它是如何重复的。试试上面的代码,看看它不起作用。为我工作的东西,像这样混乱,就是引用每一个条目;但如果这不是csv的建立方式,那不会有太大的好处。 ''s ='“param = \'(a,b)\'”,“param2”,“param3”''给出了所需的结果('len(items [0])= 3', – dwanderson

+0

我认为你的标题是错误的,你没有一个有效的带引号的CSV文件,而是一个带有引号的CSV文件,这就是为什么答案可以,为你自己的格式创建你自己的解析器,而不是使用标准格式的标准解析器 –

+0

所以...让我们来谈谈有效的CVS ....想象一下用逗号分隔值的文件Python csv模块doc表示字段可以是未知的,其中一个值在引用字符串中包含逗号。使用python的csv模块解析它? – DVN

回答

3

不幸的是,csv模块不处理它认为引用得不好的文本,或者看起来如此。一种选择是依傍正则表达式,像

>>> s = 'param="(a, b)", param2, param3' 
>>> re.findall(r'\s*((?:[^,\"]|\"[^\"]*\")+)\s*', s) 
['param="(a, b)"', 'param2', 'param3'] 
>>> s = 'param="(a, b)" "more quotes" "yet,more,quotes", param2, param3' 
>>> re.findall(r'\s*((?:[^,\"]|\"[^\"]*\")+)\s*', s) 
['param="(a, b)" "more quotes" "yet,more,quotes"', 'param2', 'param3'] 

(这将是好得多,如果你可以从一个更好的格式的初始字符串开始,所以如果你能控制,这将是一个更好的方法)

+0

正则表达式中的双引号之前是否有斜线? – QuestionC