2014-12-05 54 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