我有一个类似的字典:
mydict = {"foo":[1,2], "bar":[3,4], "asdf":[5,6]}
我正在尝试将其写入CSV文件,使其看起来像:
foo,bar,asdf
1,3,5
2,4,6
我花了最后一小时寻找解决方案,而我发现的最接近的解决方案建议做这样的事情:
headers = mydict.keys()
with open("File2.csv","w") as f:
writer = csv.writer(f)
writer.writerow(headers)
writer.writerows(zip(mydict.values())
这会将标头写好,但不会写入值。这是我的输出:
foo,bar,asdf
[1,2]
[3,4]
[5,6]
如何获得我需要的输出?我真的很感激一些帮助。谢谢
答案 0 :(得分:8)
而不是zip(mydict.values())
,请使用zip(*mydict.values())
。区别在于:
>>> zip(mydict.values())
[([1, 2],), ([3, 4],), ([5, 6],)]
>>> zip(*mydict.values())
[(1, 3, 5), (2, 4, 6)]
基本上第二个版本与zip([1, 2], [3, 4], [5, 6])
的功能相同。这在文档中称为Unpacking Argument Lists。
要强制执行排序,请使用以下命令:
>>> zip(*([k] + mydict[k] for k in sorted(mydict)))
[('asdf', 'bar', 'foo'), (5, 3, 1), (6, 4, 2)]
这包括标题,因此只需将其传递到writerows()
并删除writerow()
对标题的调用。
当然,您可以在key
函数提供sorted()
参数,以进行您喜欢的任何排序。例如,要确保与问题中的订单相同:
>>> order = {'foo': 0, 'bar': 1, 'asdf': 2}
>>> zip(*([k] + mydict[k] for k in sorted(mydict, key=order.get)))
[('foo', 'bar', 'asdf'), (1, 3, 5), (2, 4, 6)]
答案 1 :(得分:0)
您使用过Tablib吗?
我通常使用tablib来实现此用途。它非常简单易用:https://pypi.python.org/pypi/tablib/0.9.3
答案 2 :(得分:0)
此外,不使用csv
:
mydict = {"foo":[1,2], "bar":[3,4], "asdf":[5,6]}
with open("File2.csv","w") as f:
f.write(",".join(mydict.keys()) + "\n")
for row in zip(*mydict.values()):
f.write(",".join(str(n) for n in row) + "\n")
f.close()