2012-11-06 52 views
1

我有一個「CSV」,其中一些數據字段碰巧包含逗號分隔符,如下面的示例數據的第二行。Python與字段值分隔符

"1","stuff","and","things" 
"2","black,white","more","stuff" 

我不能更改源數據,我不知道如何str.split(),而不是在值「黑色,白色」分裂。

方式我走近我的問題:

  1. 我看着分區(),並看不出這將有利於我。
  2. 我確定一個正則表達式可以正確捕獲數據,但我不確定如何將一個分割成幾條。
  3. 由於源代碼中的每一行總是具有相同數量的字段,所以我認爲設置maxsplit可以幫助我們解決這個問題,因爲它認爲它仍然會在「黑色,白色」內分裂,我最終會失去最後一個值(在這種情況下這將是「東西」)。

當然,這很容易克服,所以我期待着學習新東西!

非常感謝您的幫助。

+0

你是否看了CSV庫包括在Python? http://docs.python.org/2/library/csv.html – del

+0

你忘了看看最明顯的 - ['csv'模塊](http://docs.python.org/2/library/csv .html) –

+0

line.replace('「,','」;')。split(';')? –

回答

0

逗號外的字符串總是其次是雙引號。剛上,",而不僅僅是,(甚至","

>>> x = '"2","black,white","more","stuff"' 
>>> x 
'"2","black,white","more","stuff"' 
>>> x.split(',"') 
['"2"', 'black,white"', 'more"', 'stuff"'] 
>>> [y.strip('"') for y in x.split(',"')] 
['2', 'black,white', 'more', 'stuff'] 

當然,編輯拆分效率

shlex YevgenYampolskiy的建議也是一種選擇。

>>> x = '"2","black,white","more","stuff"' 
>>> x 
'"2","black,white","more","stuff"' 
>>> import shlex 
>>> y = shlex.shlex(x) 
>>> [i.strip('"') for i in y if i != ','] 
['2', 'black,white', 'more', 'stuff'] 
+0

感謝您提出的解決方案並展示替代方案。我還發現line.replace('',','';')。split(';')(由@FacundoOlano提供)巧妙地工作。 – user1801810

+0

對於不包含引號的字段(這是有效的CSV),這將打破,並且如果它們具有不平衡的引號,則可能會錯誤地處理字段。恕我直言,應使用CSV模塊,而不是滾動您自己的CSV解析器。 – del

+0

@del正確。我試圖解決user1801810的具體問題比我試圖推出我自己的CSV解析器更多。也許我應該添加一個免責聲明? – jsvk

1

如果您的源不是CSV,只是想和你來平衡你的字符串引號,你可以嘗試使用shlex模塊:

import shlex 
lex = shlex.shlex('"2","black,white","more","stuff"') 
for i in lex: 
    print i 
+0

*劃傷頭*似乎沒有做任何事情,它返回相同的數據我開始於 – user1801810

+0

它逐項輸入(闖入邏輯話)。您將「2」作爲一個符號,將「黑色,白色」作爲另一個符號,等等。 –

2

使用csvStringIO

>>> import csv, StringIO 
>>> data = """"1","stuff","and","things" 
... "2","black,white","more","stuff" 
... """ 
>>> reader = csv.reader(StringIO.StringIO(data)) 
>>> for row in reader: 
...  print row 
... 
['1', 'stuff', 'and', 'things'] 
['2', 'black,white', 'more', 'stuff']