带引号的逗号的CSV文件无法通过Python正确分割

时间:2012-07-09 01:53:12

标签: python regex csv comma

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

此功能输出以下内容:

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

如您所知,第一行正确地分为3个条目。 但第二行不是。我希望csv阅读器可以拆分它 分成两个,而不是我们在这里有6个。我也考虑过正则表达式 方法,但它假设一些特定的引用方言。

基本上我想要的是: 只要存在一对未引用的“,”就会拆分字符串 “”。

有没有快速和一般的方法来做到这一点?我见过一些正则表达式黑客攻击 假设每个字段总是被引用等等。我想我可以写一个小循环 这样做效率非常低,但肯定会更多 专业的建议。非常感谢!

2 个答案:

答案 0 :(得分: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', '']

答案 1 :(得分:0)

留下这个给后人,因为我也有点挣扎。

quotechar的{​​{1}}参数有助于解决此问题;如果它们在引号内(假设条目中的所有逗号都被引用),它将让你忽略delims(即在这种情况下的逗号)。也就是说,它会起作用:

csv.reader()

...逗号嵌套在引号内,但非逗号字符串没有。

Py2 docs翻录的演示代码,并进行了修改,以便Name, Message Ford Prefect, Imagine this fork as the temporal universe. Arthur Dent, "Hey, I was using that!" 是逗号(duh),而delimiter是您的双引号quotechar

"