2015-11-27 3 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]} 
] 

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

Другие структуры данных, которые могли бы иметь больше смысла, были бы такими, как это (где каждая структура dict используется, как и в настоящее время, для одной пары label/value, но, по крайней мере, dict используется для указания метки и значение):

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, так как это будет означать, что вам нужно восстановить Dict без какой-либо реальной пользы.

+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, прямо сейчас! Исправлено. Так что если downvote из-за ошибки ... – shx2

+1

Кто-то еще должен иметь downvoted, вы можете только надеяться, что они вернутся, чтобы проверить. – Bruno

2

Этот код поможет вам без привязки к определенному количеству dicts внутри data_set

Я добавил еще Dict с ключом 'потери', чтобы проверить

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

"* Этот код поможет вам, не привязавшись к определенному количеству dicts внутри data_set *": Я думаю, что большинство других Ответы уже принимали это во внимание. – Bruno

+0

@Bruno Я не пишу код, основанный на других ответах. Спасибо за ваше предложение в любом случае. –

+0

Можете ли вы сделать его совместимым с Python 3? – PyAn

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