2013-11-25 86 views
0

所以我在下面的格式几个CSV文件中:转换的.csv表字典

person,age,nationality,language 
Jack,18,Canadian,English 
Rahul,25,Indian,Hindi 
Mark,50,American,English 
Kyou, 21, Japanese, English 

我需要导入,并返回数据字典,用钥匙作为列标题在第一行中,并将每列中的所有数据作为该特定键的值。例如:

dict = { 
    'person': ['Jack', 'Rahul', 'Mark', 'Kyou'], 
    'age': [18, 25, 50, 21], 
    'nationality': ['Canadian', 'Indian', 'American', 'Japanese'], 
    'language': ['English', 'Hindi', 'English', 'English'] 
} 

任何想法,我将如何开始这个代码,并让这个代码将任何数量的.csv文件列的工作吗?

+0

查看'csv'模块。特别是'DictReader'。它应该允许你获得'[{'person':'jack','age':'18',...},...]'。从那里获得想要的东西就是一个简单的转换。 – mgilson

+0

'csv'模块可以让你将它转换为''dicts''列表。 – RyPeck

+0

我需要输出结果作为字典虽然,而不是一个列表。 – user3033494

回答

1

下面是使用Python CSV模块(文件位置:http://docs.python.org/2/library/csv.html)一个相当简单的解决方案。只需将'csv_data.csv'替换为您的CSV文件的名称即可。

import csv 

with open('csv_data.csv') as csv_data: 
    reader = csv.reader(csv_data) 

    # eliminate blank rows if they exist 
    rows = [row for row in reader if row] 
    headings = rows[0] # get headings 

    person_info = {} 
    for row in rows[1:]: 
     # append the dataitem to the end of the dictionary entry 
     # set the default value of [] if this key has not been seen 
     for col_header, data_column in zip(headings, row): 
      person_info.setdefault(col_header, []).append(data_column) 

    print person_info 
2

使用CSV模块,我会做这种方式:

with open('somefile.csv', 'rb') as input_file: 
    reader = csv.DictReader(input_file) 
    results = {} 
    for linedict in reader: 
     for (key, value) in linedict.iteritems(): 
      results.setdefault(key, []).append(value) 
3

我会去这样的事情:

import csv 

with open('input') as fin: 
    csvin = csv.reader(fin) 
    header = next(csvin, []) 
    print dict(zip(header, zip(*csvin))) 

# {'person': ('Jack', 'Rahul', 'Mark', 'Kyou'), 'age': ('18', '25', '50', ' 21'), 'language': ('English', 'Hindi', 'English', ' English'), 'nationality': ('Canadian', 'Indian', 'American', ' Japanese')} 

适应相应。

+0

这很好,很简洁。有一点需要注意的是,这将破坏不规则的行 - 也就是说,如果有'language'和''national''后面的逗号。 'reader'实例不填写丢失的字段,'zip'截断为最短的序列。这是否真正关心取决于情况。 –

0

一旦你用csv模块将数据存入列表的列表中,你可以使用压缩与dict理解中的切片相结合。

{col[0] : col[1:] for col in zip(*rows)}