将Python OrderedDict写入CSV

9
我有一个有序字典,包含多个键-值对。我需要将有序字典的内容解析为CSV格式,其中第一行是键,第二行是相应的值。我已经完成了第一行,但是我不知道如何编写第二行。有序字典中的值与预期相同(在终端中打印出来的样子):([(a, 1), (b, 2), (c, 3)])。以下是我的代码:
import csv
with open("frequencies.csv", "w") as outfile:
    csvwriter = csv.writer(outfile)
    csvwriter.writerow(myDict)

我尝试迭代值并将它们附加到列表中,但是该列表未保持有序字典的原始顺序,这似乎会使从列表中打印值以便与正确键匹配变得非常困难。
谢谢您的帮助!

不妨试试 Pandas,它是一个非常有用的库,可以处理字典、CSV 和列表。 - staticor
2
你尝试过使用 csv.DictWriter 吗? - Marat
4个回答

7

截至Python 3.7,字典保留顺序,因此您可以使用dict()将有序字典转换为可用的字典。

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

OP 不想要一个无序字典。 - colidyre
OP希望在他的CSV中“保持有序字典的原始顺序”,而这段代码可以实现。 - Frederick Chute
使用dict()函数时,如何保持顺序? - colidyre
这是Python 3.7中的一种语言特性。 - Frederick Chute
1
谢谢您澄清这个问题!将版本信息添加到答案文本中会很好。该问题是在2016年12月提出的。我认为,Python 3.5是最新版本,没有任何对字典的插入顺序进行干扰,这在3.6中发挥作用(不可靠),我认为(对此并不100%确定),并且在3.7中被Guido视为语言特性 - - 没错。 :) - colidyre

7

好的,我将在这里回答我的问题。有几个人在评论中很友善地提供了建议。如建议所述,我正在尝试使用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. 迭代有序字典中的键/值对,将每个对附加到其相应的列表中。因为Python中的列表保留其顺序,这确保了任一列表中对应索引的项彼此匹配

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

我确定有更优雅的方法来完成这个任务,但这对我的目的已足够。

3

如果您没有行的列表(可能它们不适合内存)或标题的副本(也许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)

0

1
请重新格式化您的代码。import语句已从代码中排除。 - Nagabhushan S N

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接