将键作为标题、值作为列的字典写入csv时出现问题

2024-09-18 01:39:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一本字典看起来像:

mydict = {"foo":[1,2], "bar":[3,4], "asdf":[5,6]}

我正在尝试将此文件写入CSV文件,以便它看起来像:

^{pr2}$

我花了最后一个小时寻找解决方案,最近的一个建议是这样做:

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]

如何获得所需的输出?我真的很感激你的帮助。谢谢你


Tags: 文件csv字典foobarkeys解决方案建议
3条回答

使用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。在

要强制排序,请使用以下命令:

^{pr2}$

这包括报头,所以只需将其传递到writerows()并删除对报头的writerow()调用。在

当然,您可以在那里为sorted()函数提供一个key参数来进行任何排序。例如,为了确保与问题中的顺序相同:

>>> 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)]

另外,不使用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()

你用过tablib吗?在

我通常用tablib来做这个用途。使用起来非常简单:https://pypi.python.org/pypi/tablib/0.9.3

http://docs.python-tablib.org/en/latest/api/

相关问题 更多 >