从CSV文件读取/写入嵌套字典列表(Python)

时间:2010-07-07 14:57:21

标签: python

我有一个如下所示的数据结构:

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”方式是什么?

3 个答案:

答案 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.htmlhttp://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_dict.html