2016-06-23 5 views
1

У меня есть словарь, который выглядит следующим образом:распечатать словарь словарей на csv?

defaultdict(<type 'int'>, {'201304': defaultdict(<type 'int'>, {'District - 1': 20, 'District - 12': 9, 'District - 6': 5, 'District - 5': 1, 'District - 4': 1, 'District - 3': 1, 'District - 2': 13, 'District - 15': 1, 'District - 14': 2}), '201305': defaultdict(<type 'int'>, {'District - 1': 20, 'District - 12': 9, 'District - 6': 5, 'District - 5': 1, 'District - 4': 1, 'District - 3': 1, 'District - 2': 13, 'District - 15': 1, 'District - 14': 2}), '201306': defaultdict(<type 'int'>, {'District - 1': 20, 'District - 12': 9, 'District - 6': 5, 'District - 5': 1, 'District - 4': 1, 'District - 3': 1, 'District - 2': 13, 'District - 15': 1, 'District - 14': 2}), '201301': defaultdict(<type 'int'>, {'District - 1': 20, 'District - 12': 9, 'District - 6': 5, 'District - 5': 1, 'District - 4': 1, 'District - 3': 1, 'District - 2': 13, 'District - 15': 1, 'District - 14': 2}), '201302': defaultdict(<type 'int'>, {'District - 1': 20, 'District - 12': 9, 'District - 6': 5, 'District - 5': 1, 'District - 4': 1, 'District - 3': 1, 'District - 2': 13, 'District - 15': 1, 'District - 14': 2}), '201303': defaultdict(<type 'int'>, {'District - 1': 20, 'District - 12': 9, 'District - 6': 5, 'District - 5': 1, 'District - 4': 1, 'District - 3': 1, 'District - 2': 13, 'District - 15': 1, 'District - 14': 2}), '201212': defaultdict(<type 'int'>, {'District - 1': 20, 'District - 12': 9, 'District - 6': 5, 'District - 5': 1, 'District - 4': 1, 'District - 3': 1, 'District - 2': 13, 'District - 15': 1, 'District - 14': 2})}) 

Я хочу CVS, которая выглядит следующим образом:

month,District - 1,District -2, District -3...... for however many districts there are 
201304,20,9,5,6,..... 

что я прямо сейчас:

with open('output.csv','wb') as output_file: 
    w= csv.writer(output_file) 
    w.writerows(months.items()) 

месяцев имя моего словаря, описанного выше. К сожалению, она выводит:

201304 defaultdict(<type 'int'>, {'District - 1': 20, 'District - 12': 9, 'District - 6': 5, 'District - 5': 1, 'District - 4': 1, 'District - 3': 1, 'District - 2': 13, 'District - 15': 1, 'District - 14': 2}) 
201305 defaultdict(<type 'int'>, {'District - 1': 20, 'District - 12': 9, 'District - 6': 5, 'District - 5': 1, 'District - 4': 1, 'District - 3': 1, 'District - 2': 13, 'District - 15': 1, 'District - 14': 2}) 
201306 defaultdict(<type 'int'>, {'District - 1': 20, 'District - 12': 9, 'District - 6': 5, 'District - 5': 1, 'District - 4': 1, 'District - 3': 1, 'District - 2': 13, 'District - 15': 1, 'District - 14': 2}) 
201301 defaultdict(<type 'int'>, {'District - 1': 20, 'District - 12': 9, 'District - 6': 5, 'District - 5': 1, 'District - 4': 1, 'District - 3': 1, 'District - 2': 13, 'District - 15': 1, 'District - 14': 2}) 
201302 defaultdict(<type 'int'>, {'District - 1': 20, 'District - 12': 9, 'District - 6': 5, 'District - 5': 1, 'District - 4': 1, 'District - 3': 1, 'District - 2': 13, 'District - 15': 1, 'District - 14': 2}) 
201303 defaultdict(<type 'int'>, {'District - 1': 20, 'District - 12': 9, 'District - 6': 5, 'District - 5': 1, 'District - 4': 1, 'District - 3': 1, 'District - 2': 13, 'District - 15': 1, 'District - 14': 2}) 
201212 defaultdict(<type 'int'>, {'District - 1': 20, 'District - 12': 9, 'District - 6': 5, 'District - 5': 1, 'District - 4': 1, 'District - 3': 1, 'District - 2': 13, 'District - 15': 1, 'District - 14': 2}) 

Что мне нужно 1 строка для каждого месяца:

month,District - 1,District -2, District - 3, .... (as many as show up) 
201304,22,34,2,3,4,2,3,14 
201305,34,22,1,3,5 
201306,23,4,42,4,2,2,24,2,5,6,6,7,1 

Любые предложения о том, как изменить свой код, чтобы сделать это?

+0

Можете ли вы дать 2 строки примера из 63 строк, которые вы хотите иметь. поскольку пока не ясно, как вы хотите, чтобы это появилось, так как в начале вопроса в вашем примере у вас было 1 дата и все районы в одной строке, тогда вы просите написать 1 дату и 1 район в строке – Hani

+0

извините, а не 63 , но столько строк, сколько месяцев. Я был в замешательстве в моем более раннем описании, теперь должен быть более последовательным. – BigBoy1337

ответ

1

Вы можете использовать csv.DictWriter, но нужно добавить месяц колонку, так как это двумерная словарь:

#!python3 
from collections import defaultdict 
import csv 

# populate the defaultdict "months" 
# <deleted to keep short> 

# Build a set of unique districts 
s = set() 
for k,v in months.items(): 
    s.update(v.keys()) 

# open per requirements of csv.writer 
with open('out.csv','w',newline='') as f: 
    # wrap in a DictWriter and specify column names 
    w = csv.DictWriter(f,fieldnames=['month']+list(sorted(s))) 
    w.writeheader() 
    for k,v in months.items(): 
     # copy the dict of districts, add a month key and write the row 
     temp = dict(v) 
     temp['month'] = k 
     w.writerow(temp) 

Выход:

month,District - 1,District - 12,District - 14,District - 15,District - 2,District - 3,District - 4,District - 5,District - 6 
201301,20,9,2,1,13,1,1,1,5 
201302,20,9,2,1,13,1,1,1,5 
201303,20,9,2,1,13,1,1,1,5 
201304,20,9,2,1,13,1,1,1,5 
201305,20,9,2,1,13,1,1,1,5 
201306,20,9,2,1,13,1,1,1,5 
201212,20,9,2,1,13,1,1,1,5 

Примечание: При использовании Python 2 , используйте вместо этого: open:

with open('out.csv','wb') as f: 
2
with open('output.csv','wb') as output_file: 
    w= csv.writer(output_file) 
    for month,values in months.iteritems(): 
     for k,v in values.iteritems(): 
      w.writerow([month, k ,v ]) 
Update 

для каждого значения внутреннего Словаре, это может быть отсортирован на основе значения ключа, чем добавить в выходной файл

with open('output.csv','wb') as output_file: 
     w= csv.writer(output_file) 
     for month,values in months.iteritems(): 
      sortedValue = [v[1] for v in sorted(values.items(),key = lambda x: x[0]) 
      w.writerow([month] + sortedValue) 
+0

Извините, если я был неясен в своем описании раньше. Я попытался быть более ясным. Это, например, всегда будет выводить 3 столбца точно. То, что мне действительно нужно, это 1 строка за каждый месяц, 1 запись в столбце для каждого района + 1, что только месяц – BigBoy1337

+0

Внутренний цикл не гарантирует создание пар округльных значений в одном и том же окружном порядке во время каждой итерации внешней петли , поэтому итоговая таблица может быть полностью неправильной. – FMc

+0

@ BigBoy1337 добавить новый – galaxyan

2

Вы должны обработать исходные данные (а), чтобы выяснить, все районы, которые существуют и (б) реорганизовать его так, чтобы конкретные ценности могли быть изучены с помощью сочетаний по месяцам.

raw_data = { 
    '201304': {'District - 1': 120, 'District - 12': 9, 'District - 6': 5, 'District - 5': 1, 'District - 4': 1, 'District - 3': 1, 'District - 2': 13, 'District - 15': 1, 'District - 14': 2}, 
    '201305': {'District - 1': 220, 'District - 12': 9, 'District - 5': 1, 'District - 4': 1, 'District - 3': 1, 'District - 2': 13, 'District - 15': 1, 'District - 14': 2}, 
    '201306': {'District - 1': 320, 'District - 12': 9, 'District - 6': 5, 'District - 5': 1, 'District - 4': 1, 'District - 3': 1, 'District - 2': 13, 'District - 15': 1, 'District - 14': 2}, 
    '201301': {'District - 1': 420, 'District - 6': 5, 'District - 5': 1, 'District - 4': 1, 'District - 3': 1, 'District - 2': 13, 'District - 15': 1, 'District - 14': 2}, 
    '201302': {'District - 1': 520, 'District - 12': 9, 'District - 6': 5, 'District - 5': 1, 'District - 4': 1, 'District - 3': 1, 'District - 2': 13, 'District - 15': 1, 'District - 14': 2}, 
    '201303': {'District - 1': 620, 'District - 12': 9, 'District - 6': 5, 'District - 5': 1, 'District - 4': 1, 'District - 3': 1, 'District - 2': 13, 'District - 15': 1, 'District - 14': 2}, 
    '201212': {'District - 1': 720, 'District - 6': 5, 'District - 5': 1, 'District - 4': 1, 'District - 3': 1, 'District - 2': 13, 'District - 15': 1, 'District - 14': 2}, 
} 

# Reorganize data for lookup by (month, district) tuples, 
# and determine all unique district names. 

data = {} 
districts = set() 

for month, inner in raw_data.items(): 
    for district, val in inner.items(): 
     districts.add(district) 
     data[month, district] = val 

districts = sorted(districts) 

# Write data row-by-row. The CSV work should be straightforward 
# at this point. 

for month in sorted(raw_data): 
    row = [month] 
    row.extend(data.get((month, d), None) for d in districts) 
    print row 
Смежные вопросы