将 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)
所以这是这里发生的事情:
创建两个空列表对应于我订购的字典中的键和值
遍历我有序字典中的 key/value 对,将每一对附加到其各自的列表中。因为 Python 中的列表保留了它们的顺序,这确保了任一列表中相应索引的项目属于一起
将键写入我的 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())
我有一个有序的字典,正如人们所期望的那样,它包含许多键值对。我需要将有序字典的内容解析为 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)
所以这是这里发生的事情:
创建两个空列表对应于我订购的字典中的键和值
遍历我有序字典中的 key/value 对,将每一对附加到其各自的列表中。因为 Python 中的列表保留了它们的顺序,这确保了任一列表中相应索引的项目属于一起
将键写入我的 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.
编写 Dictimport 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())