2012-11-06 30 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']