【问题标题】:Trouble writing a dictionary to csv with keys as headers and values as columns将字典写入 csv 时遇到问题,其中键作为标题,值作为列
【发布时间】:2013-03-04 16:09:15
【问题描述】:

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

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]

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

【问题讨论】:

    标签: python csv dictionary


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      使用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() 调用。

      当然,您可以为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)]
      

      【讨论】:

      • 感谢@F.J,这很有帮助。我有一个捎带你的问题——我怎样才能得到排序的标题和压缩的排序值?
      • 这简直太美了。谢谢!
      【解决方案3】:

      你用过tablib吗?

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

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

      【讨论】:

        猜你喜欢
        • 2015-01-08
        • 1970-01-01
        • 2021-01-20
        • 1970-01-01
        • 1970-01-01
        • 2018-08-30
        • 1970-01-01
        • 1970-01-01
        • 2012-11-19
        相关资源
        最近更新 更多