【问题标题】:dictionary from JSON to CSV从 JSON 到 CSV 的字典
【发布时间】:2016-12-29 07:25:12
【问题描述】:

我有一个 JSON 文件,其中包含一个包含许多键值对的字典。我想将其写入单个 CSV。一种方法是简单地遍历每个键:

csvwriter.writerow([f["dict"]["key1"], f["dict"]["key2"],
                    f["dict"]["key3"], ... ])

这会很乏味。

另一种可能性是简单地使用

csvwriter.writerow([f["dict"].values()])

但它将所有内容写入 CSV 文件的一列,这没有帮助。

有没有办法可以将每个值写入 CSV 文件的一列?

【问题讨论】:

  • JSON文件中key的顺序是否需要保留?如果不是,是什么决定了它们在 CSV 文件的列中出现的顺序?
  • 没有。似乎是随机的。
  • 嗯,似乎让/允许数据出现在 CSV 的随机列中会使之后的处理变得困难。
  • 我想我误解了你的评论。是的,它需要保存
  • 在这种情况下,您可以通过在fieldnames 列表中按所需顺序列出您已接受的答案来控制它们的顺序。但是,这必须手动创建(并且可能会维护),并且可能与它们在 JSON 文件本身中出现的顺序不匹配。

标签: python json csv dictionary


【解决方案1】:

您可能想使用csv.DictWriter

官方文档中的示例非常简单:

import csv

with open('names.csv', 'w') as csvfile:
    fieldnames = ['first_name', 'last_name']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

    writer.writeheader()
    writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})
    writer.writerow({'first_name': 'Lovely', 'last_name': 'Spam'})
    writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'})

请注意,您必须向构造函数提供fieldnames。如果您确定所有 dict 具有相同的键并且不关心输出的顺序,您可以使用 list(first_dict) 来获取列名,否则,您需要想出一个方法更明确地指定它们。

【讨论】:

    【解决方案2】:

    Pandas 适合这种事情。

    我会将 JSON 文件读入 pandas 数据框 (link)。然后将其写为 CSV (link)。

    import pandas as pd
    
    #read in the json
    df = pd.read_json("json_path_here")
    
    # write the csv
    df.to_csv("csv_path_here")
    

    【讨论】:

      【解决方案3】:

      相当于你的代码:

      csvwriter.writerow(f["dict"].values())
      

      注意:为此,您的字典应该是collections.OrderedDict,因为 Python 的默认字典没有排序。因此,您最终会在每一行中得到不同的顺序。

      或者,更好的方法是使用DictWriter(您不需要有序字典):

      csvwriter.writerow(f["dict"])
      

      【讨论】:

      • 我使用的是 Python 2.7,当我输入星号时,它显示“SyntaxError: Invalid Syntax”。我有什么需要做的吗?
      • 你能和我分享一下f的价值吗?只需print f 并与我分享
      • {"stats": { "item1": 3153, "totalPlayerScore": 0, ... }}
      • 使用 dictwriter 并使用:csvwriter.writerow(f["dict"])。那样有用吗? (注:没有*
      • 是的,它有效。谢谢你的帮助。碰巧我的问题比这复杂得多,所以我将发布另一个问题,其中包含我的问题的更复杂版本。
      【解决方案4】:

      不必使用csv.DictWriter。以下内容适用于 Python 2 和 3,展示了如何创建一个 CSV 文件,该文件将自动以与它们在 JSON 文件中出现的顺序相同的顺序包含键/值对(而不需要手动定义的 fieldnames 列表):

      from collections import OrderedDict
      import csv
      import json
      from io import StringIO
      
      # in-memory JSON file for testing
      json_file = StringIO(u'{"dict": {"First": "value1", "Second": "value2",'
                                      '"Third": "value3", "Fourth": "value4"}}')
      
      # read file and preserve order by using OrderedDict
      json_obj = json.load(json_file, object_pairs_hook=OrderedDict)
      
      with open('pairs.csv', 'w') as csvfile:
          writer = csv.writer(csvfile)
          writer.writerow(json_obj["dict"].keys())  # header row
          writer.writerow(json_obj["dict"].values())
      

      pairs.csv 文件内容写入:

      First,Second,Third,Fourth
      value1,value2,value3,value4
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-20
        • 2014-12-23
        • 1970-01-01
        • 2014-08-01
        • 2016-11-20
        • 2016-11-22
        • 1970-01-01
        • 2014-04-16
        相关资源
        最近更新 更多