我有一个如下所示的数据结构:
data =[
{'key_1': { 'calc1': 42, 'calc2': 3.142 } },
{'key_2': { 'calc1': 123.4, 'calc2': 1.414 } },
{'key_3': { 'calc1': 2.718, 'calc2': 0.577 } }
]
我希望能够使用以下格式将数据保存/加载到CSV文件中
key, calc1, calc2 <- header
key_1, 42, 3.142 <- data rows
key_2, 123.4, 1.414
key_3, 2.718, 0.577
将这种数据结构读取/保存到上述CSV文件中的“Pythonic”方式是什么?
答案 0 :(得分:6)
只是为了显示使用csv模块的版本:
from csv import DictWriter
data =[
{'key_1': { 'calc1': 42, 'calc2': 3.142 } },
{'key_2': { 'calc1': 123.4, 'calc2': 1.414 } },
{'key_3': { 'calc1': 2.718, 'calc2': 0.577 } }
]
with open('test.csv', 'wb') as f:
writer = DictWriter(f, ['key', 'calc1', 'calc2'])
writer.writerow(dict(zip(writer.fieldnames, writer.fieldnames))) # no automatic header :-(
for i in data:
key, values = i.items()[0] # each dict in data contains only one entry
writer.writerow(dict(key=key, **values)) # first make a new dict merging the key and the values
答案 1 :(得分:5)
由于您的要求和结构中的所有特性,我认为不可能使用csv
模块,但您可以非常轻松地手动编写它:
>>> with open('test.txt', 'w') as f:
f.write(','.join(['key', 'calc1', 'calc2']) + '\n')
f.writelines('{},{},{}'.format(k, *v.values()) + '\n' for l in data for k,v in l.items())
答案 2 :(得分:-1)
我觉得最简单的方法是首先将字典转换为pandas数据帧,并从那里非常方便地转换为csv文件。
import pandas as pd
df = pd.DataFrame.from_dict(data, orient='index') # it is either ‘columns’ or ‘index’ (simple transpose)
df.to_csv('filepath/name.csv')
将文件加载回dict表格
df.to_csv('filepath/name.csv')
data_dict = df.to_dict()
对于更复杂的案例,请查看pandas文档 http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.from_dict.html 和http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_dict.html