将csv列转换为python中的字典

时间:2014-08-25 10:52:33

标签: python

我有一个包含以下数据的csv文件。

Column-1 Column-2 Column-3
bob      sweet    4
alice    uber     4.5
bob      uber     4
alice    sweet    4.5
razi     fav      2.5
razi     uber     3.5
bob      fav      4

我想将其转换为如图所示的字典

   A={'bob':{'sweet':'4', 'uber':'4', 'fav':'4'}, 
      'alice':{'uber':'4.5', 'sweet':'4.5'}, 
      'razi':{'fav':'2.5', 'uber':'3.5'}}

在python中

为此我愿意这样做..将csv转换为像这样列出然后得到我的输出。我无法这样做,如图所示,重复按键。

   A={'bob':['sweet','4'], 
      'alice':['uber','4.5'], 
      'bob':['uber','4'], 
      'alice':['sweet','4.5'], 
      'razi':['fav','2.5'], 
      'razi':['uber','3.5'], 
      'bob':['fav','4']}

任何人都可以提出解决问题的方法吗?

1 个答案:

答案 0 :(得分:3)

假设您的数据中没有空间,而您的所有实际数据行都只有3个字段:

import logging
logging.basicConfig(level=logging.INFO) # <- in a real application,
                                           # should be set application-wide
                                           # from a config file

logger = logging.getLogger("CSV import")

result = {}
nlines = 0
ok = 0
warnings = 0
with open("my_file.csv") as f:
    f.readline() # Skip header. Assuming only one line of heading

    for row in (line.split() for line in f):
        nlines += 1
        try:
            k1,k2, val = row
            result.setdefault(k1,{})[k2] = val
            ok += 1
        except ValueError:
            logger.warning("Format mismatch: %s", row)
            warnings += 1
            # what to do next?

logger.info("%d lines read. %d imported. %d warnings",nlines,ok,warnings)

from pprint import pprint
pprint(result)

根据您的样本数据文件,这会产生:

INFO:CSV import:7 lines read. 7 imported. 0 warnings
{'alice': {'sweet': '4.5', 'uber': '4.5'},
 'bob': {'fav': '4', 'sweet': '4', 'uber': '4'},
 'razi': {'fav': '2.5', 'uber': '3.5'}}

这里的技巧是使用setdefault来访问外部字典。如果密钥已经存在,它将返回值 - 如果这是我们第一次遇到该密钥,则返回新字典。之后,这只是像往常一样将值添加到内部字典中。