2016-11-07 273 views
-2

我有一个CSV文件如下所示。我需要将CSV转换为使用Python的字典词典。如何将csv转换为Python中字典的字典?

userId movieId rating 
1   16 4 
1   24 1.5 
2   32 4 
2   47 4 
2   50 4 
3  110 4 
3  150 3 
3  161 4 
3  165 3 

输出应该像图所示

dataset={'1':{'16':4,'24':1.5}, 
     '2':{'32':4,'47':4,'50':4}, 
     '3':{'110':4,'150':3,'161':4,'165':3}} 

请让我知道如何做到这一点。在此先感谢

+6

在解决这个迄今为止任何企图?如果是这样,请通过编辑您的问题来分享它们。如果没有,请在提问前尝试一些事情。 –

+1

Downvoted,因为吉姆是正确的。 –

回答

2

您正在寻找的嵌套字典。在Python中实现perl的autovivification功能(详细说明请参见here)。这是一个MWE。

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import csv 

class AutoVivification(dict): 
    """Implementation of perl's autovivification feature.""" 
    def __getitem__(self, item): 
     try: 
      return dict.__getitem__(self, item) 
     except KeyError: 
      value = self[item] = type(self)() 
      return value 

def main(): 
    d = AutoVivification() 
    filename = 'test.csv' 
    with open(filename, 'r') as f: 
     reader = csv.reader(f, delimiter=',') 
     next(reader)  # skip the header 
     for row in reader: 
      d[row[0]][row[1]] = row[2] 

    print(d) 
    #{'1': {'24': '1.5', '16': '4'}, '3': {'150': '3', '110': '4', '165': '3', '161': '4'}, '2': {'32': '4', '50': '4', '47': '4'}} 

if __name__ == '__main__': 
    main() 

test.csv内容,

userId,movieId,rating 
1,16,4 
1,24,1.5 
2,32,4 
2,47,4 
2,50,4 
3,110,4 
3,150,3 
3,161,4 
3,165,3 
+0

海,在上面的代码中,“d”不会进一步存储。 –

0
import numpy as np 

col1,col2,col3 = np.loadtxt('test2.csv',delimiter=',',skiprows=1,unpack=True,dtype=int) 

dataset = {} 

for a,b,c in zip(col1,col2,col3): 
    if str(a) in dataset: 
     dataset[str(a)][str(b)]=str(c) 
    else: 
     dataset[str(a)]={str(b):str(c)} 
print(dataset) 

这应该做的。上面的示例文件看起来像tsv(制表符分隔值)。如果是这样,请删除我的示例中的分隔符标志。

+0

非常感谢,它的工作,但我没有得到小数点。 –

0
import csv 
dataset = dict() 
with open("file_name", "rb") as csv_file: 
    data = csv.DictReader(csv_file) 
    for row in data: 
     old_data = dataset.get(row["userId"], None) 

     if old_data is None: 
      dataset["userId"] = {row["movieId"]: row["rating"] } 
     else: 
      old_data[row["movieId"]] = row["rating"] 
      dataset[row["userId"]] = old_data