2015-11-27 70 views
6

假設我有一個像這樣的字典數據集的列表,列表寫成CSV Python的

data_set = [ 
    {'Active rate': [0.98, 0.97, 0.96]}, 
    {'Operating Expense': [3.104, 3.102, 3.101]} 
] 

我需要遍歷字典的列表,並把鑰匙作爲列標題,它的價值爲行,將其寫入CSV文件。

Active rate Operating Expense 
0.98   3.104 
0.97   3.102 
0.96   3.101 

這是我試過

data_set = [ 
    {'Active rate': [0.98, 0.931588, 0.941192]}, 
    {'Operating Expense': [3.104, 2.352, 2.304]} 
] 

import csv 

with open('names.csv', 'w') as csvfile: 
    fieldnames = ['Active rate', 'Operating Expense'] 
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames) 

    writer.writeheader() 
    writer.writerow({'Active rate': 0.98, 'Operating Expense': 3.102}) 
    writer.writerow({'Active rate': 0.97, 'Operating Expense': 3.11}) 
    writer.writerow({'Active rate': 0.96, 'Operating Expense': 3.109}) 

爲了簡便起見,我已經減少了按鍵2和3

如何解決這個問題的值列表?

感謝

+4

什麼實際問題? – thefourtheye

+0

你想知道如何自動寫入每一行,而不是手動將這些值手動放在一起嗎? – albert

+0

是的。我需要知道如何自動寫入每一行。 – PyAn

回答

2
data_set = [ 
    {'Active rate': [0.98, 0.97, 0.96]}, 
    {'Operating Expense': [3.104, 3.102, 3.101]} 
] 

首先,只是一個簡短的評論,你的初始數據結構並不一定有意義。你使用的是一個字典列表,但每個字典似乎只使用一個密鑰,這似乎是擊敗了它的目的。

其他更有意義的數據結構可能是這樣的(每個字典結構都使用,就像你現在所用的那樣,對於一個標籤/值對,但至少該字典用於告訴標籤和值):

data_set = [ 
    {'label': 'Active rate', 'values': [0.98, 0.97, 0.96]}, 
    {'label': 'Operating Expense', 'values': [3.104, 3.102, 3.101]} 
] 

或者,也許會更好,一個OrderedDict,讓您在初始數據集的順序和鍵/值映射好處:

from collections import OrderedDict 
data_set = OrderedDict() 
data_set['Active rate'] = [0.98, 0.97, 0.96] 
data_set['Operating Expense'] = [3.104, 3.102, 3.101] 

當然,我們不」 t總是選擇我們得到的數據結構,所以讓我們假設你c不會改變它。然後,您的問題就成爲交換初始數據集中行和列角色的問題。實際上,您希望同時遍歷多個列表,爲此,zip非常有用。

import csv 

fieldnames = [] 
val_lists = [] 
for d in data_set: 
    # Find the only used key. 
    # This is a bit awkward because of the initial data structure. 
    k = d.keys()[0] 
    fieldnames.append(k) 
    val_lists.append(d[k]) 

with open('names.csv', 'w') as csvfile: 
    writer = csv.writer(csvfile)  
    writer.writerow(fieldnames) 

    for row in zip(*val_lists): 
     # This picks one item from each list and builds a list. 
     # The first row will be [0.98, 3.104] 
     # The second row will be [0.97, 3.102] 
     # ... 
     writer.writerow(row) 

注意,沒有必要爲DictWriter當你使用zip,因爲這將意味着你需要重建一個字典,沒有任何實際的好處。

+0

您也可以使用'writerows(zip(* val_lists))'作爲@MartinEvans建議的方式更簡潔地完成最後一部分。 – Bruno

3

以下辦法應該爲你提供的數據結構的工作:

import csv 

data_set = [ 
    {'Active rate': [0.98, 0.97, 0.96]}, 
    {'Operating Expense': [3.104, 3.102, 3.101]} 
] 

fieldnames = ['Active rate', 'Operating Expense'] 
rows = [] 

for field in fieldnames: 
    for data in data_set: 
     try: 
      rows.append(data[field]) 
      break 
     except KeyError, e: 
      pass 

with open('names.csv', 'wb') as f_output: 
    csv_output = csv.writer(f_output) 
    csv_output.writerow(fieldnames) 
    csv_output.writerows(zip(*rows)) 

給你以下CSV輸出文件:

Active rate,Operating Expense 
0.98,3.104 
0.97,3.102 
0.96,3.101 
3
d1 = {'Active rate': [0.98, 0.931588, 0.941192]} 
d2 = {'Operating Expense': [3.104, 2.352, 2.304]} 

with open('names.csv', 'w') as csvfile: 
    fieldnames = zip(d1, d2)[0] 
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames) 
    writer.writeheader() 

    for row in zip(d1['Active rate'], d2['Operating Expense']): 
     writer.writerow(dict(zip(fieldnames, row))) 

出於性能考慮,你可能想使用itertools.izip超過zip根據列表的長度。

+1

'itertools.izip'對於較大的數據集確實是一個很好的建議。 (這可能會導致因爲索引而替換'zip(d1,d2)[0]''的問題,但這不應該很難解決。 – Bruno

3

(這個答案具有使用外部庫的劣勢,但)

pandas已經非常有力和簡單的工具來處理的CSV文件。您可以使用to_csv

注意你的數據結構是笨拙的結構,所以我們首先將其轉換爲更直觀的結構

data_set2 = { x.keys()[0] : x.values()[0] for x in data_set } 

import pandas as pd 
df = pd.DataFrame(data_set2) 
df.to_csv('names.csv', index = False) 
+0

@Bruno,right!thanks。now now。如果downvote是由於錯誤... – shx2

+1

其他人必須已經downvoted,你只能希望他們回來檢查 – Bruno

2

此代碼將幫助您不必連接到一定數量類型的字典裏面data_set

我添加了另一個帶有'損失'鍵的字典,用於測試

import csv 

data_set = [ 
    {'Active rate': [0.98, 0.97, 0.96]}, 
    {'Operating Expense': [3.104, 3.102, 3.101]}, 
    {'Losses': [1.14, 2.28, 3.42]} 
] 

headers = [d.keys()[0] for d in data_set] 

with open('names.csv', 'w') as csvfile: 
    writer = csv.DictWriter(csvfile, fieldnames=headers) 
    writer.writeheader() 
    for item in zip(*[x.values()[0] for x in data_set]): 
     more_results = list() 
     more_results.append(headers) 
     more_results.append(item) 
     writer.writerow(dict(zip(*more_results))) 

輸出:

enter image description here

+1

「*此代碼將幫助你沒有被綁定到data_set *內的一定數量的字典」:我認爲大多數其他答案已經考慮到了這個問題 – Bruno

+0

@Bruno我不會根據其他答案編寫代碼,無論如何感謝您的建議 –

+0

您能否讓Python 3兼容? – PyAn