2016-02-29 3 views
0

Я пытаюсь читать CSV-файл, отформатированный как таковойВложенные словарь по умолчанию в словарь по умолчанию

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

и выйти вложенную словарь как этот

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

я могу получить номер и его ассоциированные строки из csv, но как только я попробую и вложен, я получаю AttributeError: объект «collections.defaultdict» не имеет атрибута «append», я думаю, что в большинстве случаев он выключен в нужное начало

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

объекты Dict не 'append' метод вместо этого использовать' update' метод – efirvida

+0

Ну, что тип ** subresult [csv_headings [J]] **? Вы не дали нам воспроизводимого примера. Когда я пытаюсь выполнить это с моими CSV-файлами, я получаю ключевую ошибку при j = 1, а это значит, что результирующий объект ** None ** должен будет использовать ** append **. Если это должен быть словарь, то вы все еще сосать, так как ** append ** не является методом словаря. – Prune

+0

subresult должен быть словарь со списками, соответствующими ключам –

ответ

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

thats the money thanks! –

2

объекты Dict не метод Append вместо этого использовать метод обновления

что-то вроде:

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, если я вынимаю вложенный словарь. Он работает –

Смежные вопросы