2012-09-06 53 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"