将 Python OrderedDict 写入 CSV

Write Python OrderedDict to CSV

我有一个有序的字典,正如人们所期望的那样,它包含许多键值对。我需要将有序字典的内容解析为 CSV 格式,第一行是键,第二行是它们各自的值。我把第一行写下来了,但我不知道如何写第二行。 OrderedDict 中的值是您所期望的(在终端中打印出来的样子):([(a, 1), (b, 2), (c, 3)])。这是我拥有的:

import csv
with open("frequencies.csv", "w") as outfile:
    csvwriter = csv.writer(outfile)
    csvwriter.writerow(myDict)

我尝试遍历这些值并将它们附加到一个列表中,但是该列表没有保持有序字典的原始顺序,据我所知,这会使打印变得非常困难列表中的值到 CSV,以便它们与正确的键匹配。

在此先感谢您的帮助!

好吧,我要在这里回答我自己的问题。有几个人很友好地在评论中提出了建议。正如建议的那样,我正在努力用 Pandas 来完成这个。然而,当我这样做时,我突然想到我可以做到这一点而不必了解 Pandas 模块的来龙去脉。这是我想出的:

import csv

keys, values = [], []

for key, value in myOrderedDict.items():
    keys.append(key)
    values.append(value)       

with open("frequencies.csv", "w") as outfile:
    csvwriter = csv.writer(outfile)
    csvwriter.writerow(keys)
    csvwriter.writerow(values)

所以这是这里发生的事情:

  1. 创建两个空列表对应于我订购的字典中的键和值

  2. 遍历我有序字典中的 key/value 对,将每一对附加到其各自的列表中。因为 Python 中的列表保留了它们的顺序,这确保了任一列表中相应索引的项目属于一起

  3. 将键写入我的 CSV 的第一行,将值写入第二行

我确信有更优雅的方法可以做到这一点,但这对我的目的来说已经足够了。

这是另一个更通用的解决方案,假设您没有行列表(可能它们不适合内存)或 headers 的副本(可能是 write_csv函数是通用的):

def gen_rows():
    yield OrderedDict(a=1, b=2)

def write_csv():
    it = genrows()
    first_row = it.next()  # __next__ in py3
    with open("frequencies.csv", "w") as outfile:
        wr = csv.DictWriter(outfile, fieldnames=list(first_row))
        wr.writeheader()
        wr.writerow(first_row)
        wr.writerows(it)

显示如何使用 Pandas.

编写 Dict
import pandas as pd

d = {
   'a': (1, 101),
   'b': (2, 202),
   'c': (3, 303)
}
pd.DataFrame.from_dict(d, orient="index").to_csv("dict.csv")

从 Python 开始,3.7 词典保留顺序,因此您只需使用 dict() 即可将有序词典转换为可用词典。

with open("frequencies.csv", "w") as outfile:
    csvwriter = csv.writer(outfile)
    csvwriter.writerow(dict(myDict))
    csvwriter.writerow(dict(myDict).values())