2016-02-29 74 views
0

我试图读取格式为这样嵌套一个默认的字典中的默认词典

Number,Letter,Color, 
1,a,blue, 
1,b,green, 
1,c,yellow, 

一个CSV文件,并得到了嵌套的字典这样

{ 
"1":[ 
    "Letter":["a","b","c"], 
    "Color":["blue","green","yellow"] 
    ] 
} 

我能得到的数字,其从csv相关的行,但只要我尝试和嵌套,我得到AttributeError:'collections.defaultdict'对象没有属性'追加',我认为我大多是关闭到正确的开始

result = co.defaultdict(lambda: co.defaultdict(list)) 
subresult = co.defaultdict(list) 

with open(os.path.join(inputdir,tablelist[i])) as f: 

    csv_reader = csv.reader(f) 
    csv_headings = next(csv_reader) 
    read = csv.DictReader(f, fieldnames=csv_headings) 

    for line in read: 
     subresult = {} 
     for j in range(1,len(csv_headings)): 
      #result[line[csv_headings[0]]].append(line[csv_headings[j]]) 
      result[line[csv_headings[0]]].append(subresult[csv_headings[j]].append(line[csv_headings[j]]))  
+0

的字典对象没有'append'方法,而不是使用'update'方法 – efirvida

+0

那么,什么是**子结果[csv_headings [J] **的类型?你没给我们一个重复的例子。当我尝试这与我的CSV文件,我在J = 1一键搞定的错误,这意味着生成的对象,**无**必须** **追加方法。如果这应该是一本字典,那么你还在吮吸,因为** **追加是不是一本字典的方法。 – Prune

+0

子结果应符合相应的键 –

回答

2

在您的文件摆脱标题行的,这作品:

from collections import defaultdict 
d = defaultdict(lambda : defaultdict(list)) 
with open('myFile.txt', 'r') as f: 
    for line in f: 
     r = line.strip().split(",") 
     number, letter, color = r[:3] 
     d[number]['Letter'].append(letter) 
     d[number]['Color'].append(color) 

print d 

输出

defaultdict(<function <lambda> at 0x7f3d99f49b90>, {'1': defaultdict(<type 'list'>, 
{'Color': ['blue', 'green', 'yellow'], 'Letter': ['a', 'b', 'c']})}) 
+0

那钱感谢名单一本字典! –

2

的字典对象没有追加方法改为使用更新方法

类似:

result[line[csv_headings[0]]].update(subresult[csv_headings[j]].append(line[csv_headings[j]])) 

例如:

In [1]: a ={'a':1} 

In [2]: a.append({'b':2}) 
--------------------------------------------------------------------------- 
AttributeError       Traceback (most recent call last) 
<ipython-input-4-02c9b6cd9396> in <module>() 
----> 1 a.append({'b':2}) 

AttributeError: 'dict' object has no attribute 'append' 

In [3]: a.update({'b':2}) 

In [3]: a 
Out[3]: {'a': 1, 'b': 2} 
+0

我使用的是defaultdict里面确实有append方法,如果我拿出嵌套字典它的工作原理 –