3

我有一本看起来像这样的字典:

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]

如何获得我需要的输出?我真的很感激一些帮助。谢谢

4

3 回答 3

9

而不是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]). 这在文档中称为解包参数列表。

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

>>> 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)]
于 2013-03-15T19:56:03.820 回答
0

你用过tablib吗?

我通常将 tablib 用于此用途。使用起来非常简单:https ://pypi.python.org/pypi/tablib/0.9.3

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

于 2013-03-15T19:52:25.490 回答
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()
于 2013-03-15T20:25:27.313 回答