2016-12-01 79 views
0

我想創建一個字典列表並導出到一個csv文件。這些字典長短不一 - 基本上我想這樣做如下:從不同大小的字典創建數據結構python3.x

a = {'name': 'Alison', 'food1': 'bananas', 'food2': 'apples', 'food3': 'dates'} 
b = {'name': 'Ken', 'food1': 'noodles', 'food2': 'rice'} 
c = {'name': 'Max', 'food1': 'jello', 'food2': 'yogurt', 'food3': 'bananas', 'food4': 'milk} 

輸出CSV

name  | food1 |  food2  | food3 |  food4 
------------------------------------------------------------------------ 
    Alison  | bananas |  apples |  dates |  ' ' 
    Ken  | noodles |  rice  |  ' ' |  ' ' 
    Max  | jello |  yogurt | bananas |  milk 

# list of dictionaries 
data = [a, b, c] 

目前,我有一些代碼,以便能夠從詞典列表創建數據結構只要該列表中的每個字典具有相同數量的密鑰即可。

keys = data[0].keys() 

with open('profiles.csv', 'w', newline = '') as output_file: 
    dict_writer = csv.DictWriter(output_file, keys) 
    dict_writer.writeheader() 
    dict_writer.writerows(data) 

有人有辦法將長度不同的字典列表合併到上面顯示的csv中嗎?

+0

考慮使用'defaultdict'或'pandas'。 –

回答

2

這是一種可能的熊貓解決方案。這也使得使用df.to_csv方法寫入文件更方便。如果您更喜歡' 'NaN,則可以添加df = df.fillna(' ')

import pandas as pd 

a = {'name': 'Alison', 'food1': 'bananas', 'food2': 'apples', 'food3': 'dates'} 
b = {'name': 'Ken', 'food1': 'noodles', 'food2': 'rice'} 
c = {'name': 'Max', 'food1': 'jello', 'food2': 'yogurt', 'food3': 'bananas', 'food4': 'milk'} 

dcts = [a,b,c] 

df = pd.concat((pd.Series(dct) for dct in dcts), axis=1).T.set_index('name') 

#   food1 food2 food3 food4 
# name 
# Alison bananas apples dates NaN 
# Ken  noodles rice  NaN NaN 
# Max  jello yogurt bananas milk 
+1

我剛剛用python寫了一個類似的解決方案,但熊貓很棒 – Aaron

+0

謝謝,所有 - 這非常有幫助! –

1

@Yakym Pirozhenko設有大熊貓的最佳解決方案..

這裏有一個只有Python和標準庫csv

收集所有可能的密鑰:

allkeys = set() 
for d in data: 
    allkeys.extend(d.keys()) 
allkeys = list(allkeys) #freeze list order

2.寫入文件

with open(csvfile, 'wb') as f: 
    writer = csv.DictWriter(f, fieldnames=allkeys, restval='', extrasaction='ignore') 
    writer.writeheader() 
    for d in data: 
     writer.writerow(d)
+0

謝謝!這很完美 –