2015-06-11 52 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