2012-09-06 52 views
19

我对Python很陌生。我想分析一个csv文件,使得它可以识别引用值 - 例如Python正确解析CSV

1997,Ford,E350,"Super, luxurious truck"

应当分拆为

('1997', 'Ford', 'E350', 'Super, luxurious truck')

和NOT

('1997', 'Ford', 'E350', '"Super', ' luxurious truck"')

上面是我所得到的如果我使用类似str.split(,)的东西。

我该怎么做? 也最好将这些值存储在数组或其他数据结构中?因为在我从csv中获得这些值之后,我希望能够轻松地选择这些值,让我们说任何两列,并将其存储为另一个数组或其他数据结构。

+0

我编辑了问题。如果我仅使用分隔符','它不能识别引号内的',' – cornerstone

+0

您必须定义'quote' –

回答

14

以下方法完美工作

d = {} 
d['column1name'] = [] 
d['column2name'] = [] 
d['column3name'] = [] 

dictReader = csv.DictReader(open('filename.csv', 'rb'), fieldnames = ['column1name', 'column2name', 'column3name'], delimiter = ',', quotechar = '"') 

for row in dictReader: 
    for key in row: 
     d[key].append(row[key]) 

列以字段名称作为关键字存储在字典中。

+0

在col3name前面有一个缺少的开始单引号。 – codingknob

18

您应该使用csv模块:

import csv 
reader = csv.reader(['1997,Ford,E350,"Super, luxurious truck"'], skipinitialspace=True) 
for r in reader: 
    print r 

输出:

['1997', 'Ford', 'E350', 'Super, luxurious truck'] 
+0

谢谢。但是,当我尝试从文件中读取时,出现以下错误 - 'csv.Error:行包含空字节' 我的文件可能包含一百万行,如下所示 - '1,“警告,未知错误”, “car-8554.gif”,“car.gif”,“crs_04”,“change rand str,cut pos,35289,add size,9242” – cornerstone

+0

@cornerstone:你是如何创建这个文件的?你不会通过普通的方式获得NULL字节,但是如果它在文件中,如果将它看作文本,几乎可以通过任何方式读取它。 – geoffspear

+0

@Wooble它是通过将SQL数据值转储到csv文件而创建的。 我认为空值是由于连续的“,,”出现在行中。我已经想出了一个解决方案。 (c'v.csv')作为csv_file: ... reader = csv.reader((line.replace('\ 0','')for csv_file中的行),delimiter =',', quotechar ='“') ... print(reader.next())' – cornerstone

5

你必须定义在双引号作为quotechar whithin的csv.reader()声明:

>>> with open(r'<path_to_csv_test_file>') as csv_file: 
...  reader = csv.reader(csv_file, delimiter=',', quotechar='"') 
...  print(reader.next()) 
... 
['1997', 'Ford', 'E350', 'Super, luxurious truck'] 
>>> 
1

如果您不想使用CSV模块,则需要使用正则表达式。试试这个:

import re 
array = re.split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)", '1997,Ford,E350,"Super, luxurious truck"') 

如果你尝试:

print(array[3]) 

你会得到:

"Super, luxurious truck"