2012-07-09 70 views
0
def csv_split() : 
    raw = [ 
      '"1,2,3" , "4,5,6" , "456,789"', 
      '"text":"a,b,c,d", "gate":"456,789"' 
      ] 
    cr = csv.reader(raw, skipinitialspace=True) 
    for l in cr : 
     print len(l), l 

下面这个函数输出正确划分:CSV文件不能被Python

3 ['1,2,3 ', '4,5,6 ', '456,789'] 
6 ['text:"a', 'b', 'c', 'd"', 'gate:"456', '789"'] 

正如你所知道的,第一行是正确分成3项。 但第二行不是。我希望csv阅读器将其拆分为两个,而我们在这里有6个。我也想过正则表达式 的方法,但它假设了一些具体的引用方言。

基本上我想要的是: 只需在“”中分割字符串,该字符串不会在“”的一对 中引用。

有没有任何快速和一般的方法来做到这一点?我看到一些正则表达式的黑客,其中 假设每个领域总是引用等。我想我可以写一个小循环 ,这是非常低效,但肯定会赞赏一些更专业的建议。非常感谢!

+1

它正确地分裂它。您的CSV数据格式错误。你认为它应该如何分裂? – 2012-07-09 01:58:08

+0

你应该说出你真正想要的第二行,因为我无法弄清楚你要求的是什么。 – Gabe 2012-07-09 02:03:45

+0

@加贝我认为OP期望''“文本”:“a,b,c,d”和“gate”:“456,789” - 如果我误解了,请纠正我。 – Levon 2012-07-09 02:12:49

回答

2

CSV不是一种标准格式,但如果它们出现在文本内部(例如"text"":""a,b,c,d"),则通过使用两个""来避免使用引号是很常见的。 Python的CSV阅读器在这里做着正确的事情,因为它假定了这个约定。我不太清楚你期望的输出是什么,但这里是我尝试一个非常简单的CSV阅读器,它可能适合你的格式。随意适应它。

raw = [ 
    '"1,2,3" , "4,5,6" , "456,789"', 
    '"text":"a,b,c,d", "gate":"456,789"', 
    '1,2, 3,' 
] 

for line in raw: 
    i, quoted, row = 0, False, [] 
    for j, c in enumerate(line): 
     if c == ',' and not quoted: 
      row.append(line[i:j].strip()) 
      i = j + 1 
     elif c == '"': 
      quoted = not quoted 
    row.append(line[i:j+1].strip()) 
    for i in range(len(row)): 
     if len(row[i]) >= 2 and row[i][0] == '"' and row[i][-1] == '"': 
      row[i] = row[i][1:-1] # remove quotation marks 
    print row 

输出:

['1,2,3', '4,5,6', '456,789'] 
['text":"a,b,c,d', 'gate":"456,789'] 
['1', '2', '3', ''] 
+0

对不起,延迟回复。 ' “文”: “A,B,C,d”, “门”: “456789”' 应分成两个条目: [““的文字但是,是的,我想以上提到的“:”a,b,c,d“,”“大门”:“456,789”']。 就像我说的,我只是想在逗号没有被引用时分裂。 我同意CSV格式有点搞砸了。但是你知道我有时无法控制我所得到的 。 :( 感谢您的好解答,我会尝试一下,看看如何最好地解决这个问题。 – user1510809 2012-07-12 00:28:28

0

离开这个位置留给后人,因为我这个奋斗了有点太。

csv.reader()quotechar参数有助于解决此问题;如果它们在引号内(假设条目中的所有逗号都被引用过),它会让你忽略delims(即在这种情况下的逗号)。也就是说,它会为这方面的工作:

Name, Message 
Ford Prefect, Imagine this fork as the temporal universe. 
Arthur Dent, "Hey, I was using that!" 

...其中逗号已嵌套引号,但是非comma'd串也没有。

演示代码从Py2 docs撕开,并编辑,以便delimiter是一个逗号(杜)和quotechar是您的双引号"

import csv 
with open('eggs.csv', 'rb') as csvfile: 
    spamreader = csv.reader(csvfile, delimiter=',', quotechar='"') 
    for row in spamreader: 
     print ', '.join(row)