[英]Write list of dictionary into 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。
如何解决这个问题?
谢谢
以下方法适用于您提供的数据结构:
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
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)))
为了提高性能,您可能希望在zip
上使用itertools.izip
,具体取决于列表的长度。
(这个答案有使用外部库的缺点,但是)
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)
data_set = [ {'Active rate': [0.98, 0.97, 0.96]}, {'Operating Expense': [3.104, 3.102, 3.101]} ]
首先,只是一个快速评论,您的初始数据结构不一定有意义。 你正在使用一个dicts列表,但每个dict似乎只使用一个键,这似乎打败了它的目的。
其他更有意义的数据结构将是这样的(使用每个dict结构,就像你现在拥有的那样,对于一个标签/值对,但至少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]
当然,我们并不总是选择我们得到的数据结构,所以我们假设你不能改变它。 然后,您的问题就成了从初始数据集交换行和列角色的问题。 实际上,您希望同时迭代多个列表,为此, 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)
请注意,当您使用zip
,不需要DictWriter
,因为这意味着您需要重建dict而没有任何实际好处。
此代码将帮助您,而不必依赖于data_set
一定数量的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)))
输出:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.