2014-12-05 48 views
0

我正在讀取一個CSV文件,我想把它放在一個數組中,這樣我就可以根據行索引快速查找信息。這是我得到的,但似乎行不能使用split()。有什麼建議麼?如何將CSV文件放入數組中?

print csvFilePath 
a = [] 

reader = csv.reader(open(csvFilePath,'rU'),dialect=csv.excel_tab) 
print reader 
for row in reader: 
    print row 
    a.append(row.split(',')) 

print a[45]['firstname'] 
+0

是什麼'打印一個[45] ['firstname']'應該在做什麼,你的數據是什麼樣的?行也是一個列表,所以它是有道理的,你不能分裂它 – 2014-12-05 15:13:05

+0

你似乎不想使用數組,而是列表。 – user2097159 2014-12-05 15:14:23

+0

你可能只想做'a.append(row)' – user2097159 2014-12-05 15:16:38

回答

2

你最可能需要的是DictReader(正如布魯諾指出的那樣,他更快地拉動扳機)。它採用文件名並將每行作爲字典返回,這是您想要的。這將使你的代碼:

import csv 
a = [] 

reader = csv.DictReader(open("so.csv",'rU'), dialect=csv.excel_tab, delimiter=',') 
print reader 
for row in reader: 
    print row 
    a.append(row) 

print a[2]['Make'] 

任選簡化爲:

import csv 
with open("so.csv",'rU') as f: 
    a = list(csv.DictReader(f, dialect=csv.excel_tab, delimiter=',')) 
print a[2]['Make'] 

使用一些樣本數據(從Wikipedia):

Year,Make,Model,Description,Price 
1997,Ford,E350,"ac, abs, moon",3000.00 
1999,Chevy,"Venture ""Extended Edition""","",4900.00 
1999,Chevy,"Venture ""Extended Edition, Very Large""",,5000.00 
1996,Jeep,Grand Cherokee,"MUST SELL! 
air, moon roof, loaded",4799.00 

打印:

<csv.DictReader instance at 0x7fe7a3aedfc8> 
{'Price': '3000.00', 'Description': 'ac, abs, moon', 'Make': 'Ford', 'Model': 'E350', 'Year': '1997'} 
{'Price': '4900.00', 'Description': '', 'Make': 'Chevy', 'Model': 'Venture "Extended Edition"', 'Year': '1999'} 
{'Price': '5000.00', 'Description': '', 'Make': 'Chevy', 'Model': 'Venture "Extended Edition, Very Large"', 'Year': '1999'} 
{'Price': '4799.00', 'Description': 'MUST SELL!\nair, moon roof, loaded', 'Make': 'Jeep', 'Model': 'Grand Cherokee', 'Year': '1996'} 
Chevy 

這個假設如果您的文件以這樣的標題開頭,則提供密鑰。如果沒有,你可以通過標題的列表中DictReader

reader = csv.DictReader(open("so.csv",'rU'), ["Year", "Make", "Model", "Description", "Price"], dialect=csv.excel_tab, delimiter=',') 

還要注意的是隨地吐痰字符由delimiter=','參數給出。

0

好了,csv模塊的整點是爲了避免解析CSV文件自己,所以沒有,row「不能用分裂」,因爲它已經(正確地)「分裂」成一個列表。如果你希望你的行的列表,那麼它的那樣簡單

with open(csvFilePath,'rU') as f: 
    reader = csv.reader(f), dialect=csv.excel_tab) 
    a = list(reader) 

現在如果你想類型的字典(所以你可以使用a[45]['firstname'])的列表,你必須要麼使用一個csv.DictReader()代替(https://docs.python.org/2/library/csv.html#csv.DictReader) ,或從建行的字典和標題的列表,即:

headers = ["firstname", "lastname", "has_parrot",] 
with open(csvFilePath,'rU') as f: 
    reader = csv.reader(f), dialect=csv.excel_tab) 
    a = [dict(zip(headers, row)) for row in reader] 

但真正使用csv.DictReader是您更好的選擇。

0

Python的默認支持兩件式的CSV文件,一個是這樣的,用逗號隔開:

1,2,3 

另一個被等,製表符分隔:

1 2 3 

1\t2\t3 

現在假設你有這些原始數據:

firstname,surname,.. 
Adam,Smith,... 
... 

現在依存型你有哪些,你使用這個我的小包裝庫,以獲得您想要的二維數據有:

>>> import pyexcel as pe 
>>> sheet = pe.load("your_file.csv", name_columns_by_row=0) # or "your_file.tsv" 
>>> records = sheet.to_records() 
>>> records[45]["firstname"] 

詳細的文檔here