Python 将多维字典写入文件

Python 将多维字典写入文件,python,csv,pandas,dictionary,Python,Csv,Pandas,Dictionary,我有一个代码,可以计算几个指标,这些指标存储为三维字典目录。我想把这本字典打印成一个csv文件,但还没有找到一个好的方法 计算完字典中的所有元素后,我想将其打印到文件中(其中不同的时段是文件的标题,键,度量a、b和c应该是列-列键和列度量) 是否有一种简单的方法将此打印到文件?(我的第一次尝试是熊猫,但没有成功) 谢谢 from collections import defaultdict import pandas as pd import os import random # 3 dim

我有一个代码,可以计算几个指标,这些指标存储为三维字典目录。我想把这本字典打印成一个csv文件,但还没有找到一个好的方法

计算完字典中的所有元素后,我想将其打印到文件中(其中不同的
时段
是文件的标题,
,度量
a、b和c
应该是列-列键和列度量)

是否有一种简单的方法将此打印到文件?(我的第一次尝试是熊猫,但没有成功)

谢谢

from collections import defaultdict
import pandas as pd
import os
import random


# 3 dimensional dictionary that stores integers 
output_dict = defaultdict(lambda: defaultdict(lambda: defaultdict(int)))
# Array of periods
periods = range(0, 2)
# relevant keys
keys = ["key1", "key2"]

# Iterate over all periods
for period in periods:
    # Iterate over all relevant keys
    for key in keys:

        # Store results for key for each time period for each category ("a", "b", or "c")
        output_dict[key][period]["a"] += random.randint(1, 1000)
        output_dict[key][period]["b"] += random.randint(1, 1000)
        output_dict[key][period]["c"] += random.randint(1, 1000)

# This is the tricky part!!!
# Store results 
pd.DataFrame(output_dict).to_csv("output_dict.csv", index=False)

# the dictionary may look as follows:
output_dict = {"key1": {0: {"a": 0.9, "b": 0.2, "c": 0.5}, 1:{"a": 0.91, "b": 0.3, "c": 0.4}},
               "key2": {0: {"a": 0.4, "b": 0.33, "c": 0.34}, 1: {"a": 0.21, "b": 0.73, "c": 0.54}}}

为此,您应该使用
csv
模块,我认为不值得为了让数据与
pandas
数据帧构造函数很好地配合而争论您的数据。注意,我将csv写入字符串I/o缓冲区而不是文件,这样我可以轻松打印结果,但您可以简单地忽略这些内容,只使用普通的文件对象

>>> periods = [0, 1]
>>> metrics = ['a', 'b', 'c']
>>> import csv
>>> import io
现在,只需小心地建立您的行:

>>> with io.StringIO() as f:
...     writer = csv.writer(f)
...     writer.writerow(['Key','Metric', 0, 1])
...     for key in output_dict:
...         for metric in metrics:
...             row = [key, metric]
...             for p in periods:
...                 row.append(output_dict[key][p][metric])
...             writer.writerow(row)
...     final = f.getvalue()
...
16
17
18
18
17
16
16
>>> print(final)
Key,Metric,0,1
key2,a,0.4,0.21
key2,b,0.33,0.73
key2,c,0.34,0.54
key1,a,0.9,0.91
key1,b,0.2,0.3
key1,c,0.5,0.4
注意,键不会按任何特定顺序排列,因为字典是无序的。如果您提前知道所有键,您可以通过迭代所有键来施加顺序,就像我对度量和周期所做的那样(您的问题暗示这些键是提前知道的)。此解决方案可以扩展,以非常轻松地处理丢失的密钥

编辑: 您上次的编辑似乎暗示您将提前知道关键点,因此只需执行以下操作:

>>> periods = [0, 1]
>>> keys = ['key1', 'key2']
>>> metrics = ['a', 'b', 'c']
>>> with io.StringIO() as f:
...     writer = csv.writer(f)
...     writer.writerow(['Key','Metric', 0, 1])
...     for key in keys:
...         for metric in metrics:
...             row = [key, metric]
...             for p in periods:
...                 row.append(output_dict[key][p][metric])
...             writer.writerow(row)
...     final = f.getvalue()
...
16
17
16
16
17
18
18
>>> print(final)
Key,Metric,0,1
key1,a,0.9,0.91
key1,b,0.2,0.3
key1,c,0.5,0.4
key2,a,0.4,0.21
key2,b,0.33,0.73
key2,c,0.34,0.54

首先,尝试将数据转换为包含
key
a
b
c
列的数据帧。然后,转储到CSV应该是相当轻松的。如果您给出一个示例,说明您的字典是什么样子的,以及您希望CSV是什么样子的,这会有所帮助like@Andreas可能事实上,没有熊猫,可能有一种简单的方法可以做到这一点。如果你能举一个你正在使用的数据的例子,那么有人可能会回答你的问题question@Andreas对只需将您的数据转换为必要的数据框即可。@Andreas您似乎提供了某种电子表格程序的屏幕截图,这使得实际的csv看起来有些模糊……非常感谢。这正是我要找的!关于您的帖子,有两个问题:a)如何将
最终版
写入csv文件?b) 是否有一种简单的方法可以使“writerow”函数动态(例如,具有无限的周期)