【问题标题】:Writing multiple dictionaries to csv file? [duplicate]将多个字典写入 csv 文件? [复制]
【发布时间】:2014-04-12 00:14:15
【问题描述】:

感谢这个其他线程,我作为初学者使用 Python 成功地将我的字典写入了 csv: Writing a dictionary to a csv file with one line for every 'key: value'

dict1 = {0 : 24.7548, 1: 34.2422, 2: 19.3290}

csv 看起来像这样:

0  24.7548
1  34.2422
2  19.3290

现在,我想知道用相同的键组织多个字典的最佳方法是什么。我希望将键作为第一列,然后是列中的 dict 值,所有这些都具有第一行以按字典名称区分列。

当然,有很多线程都在尝试做类似的事情,例如:Trouble writing a dictionary to csv with keys as headers and values as columns,但我的数据还没有以相同的方式结构化(目前……)。也许必须先合并字典。

dict2 = {0 : 13.422, 1 : 9.2308, 2 : 20.132}
dict3 = {0 : 32.2422, 1 : 23.342, 2 : 32.424}

我的理想输出:

ID  dict1    dict2    dict3
0   24.7548  13.422   32.2422
1   34.2422  9.2308   23.342
2   19.3290  20.132   32.424

我还不确定,用于键名的列名 ID 将如何在其中发挥作用。

【问题讨论】:

    标签: python csv dictionary


    【解决方案1】:

    这是一种方法。

    my_dicts = [dict1, dict2, dict3]
    dict_names = range(1, len(my_dicts)+1)
    header = "ID," + ",".join(map(lambda x: "dict"+str(x)), dict_names) + "\n"
    all_possible_keys = set(reduce(lambda x,y: x + y.keys(), my_dicts, []))
    
    with open("file_to_write.csv", "w") as output_file:
        output_file.write(header)
        for k in all_possible_keys:
            print_str = "{},".format(k)
            for d in my_dicts:
                print_str += "{},".format(d.get(k, None))
            print_str += "\n"
            output_file.write(print_str)
    

    【讨论】:

      【解决方案2】:

      使用 csv 模块和列表理解:

      import csv
      
      dict1 = {0: 33.422, 1: 39.2308, 2: 30.132}
      dict2 = {0: 42.2422, 1: 43.342, 2: 42.424}
      dict3 = {0: 13.422, 1: 9.2308, 2: 20.132}
      dict4 = {0: 32.2422, 1: 23.342, 2: 32.424}
      
      dicts = dict1, dict2, dict3, dict4
      
      with open('my_data.csv', 'wb') as ofile:
          writer = csv.writer(ofile, delimiter='\t')
          writer.writerow(['ID', 'dict1', 'dict2', 'dict3', 'dict4'])
          for key in dict1.iterkeys():
              writer.writerow([key] + [d[key] for d in dicts])
      

      请注意,字典默认是无序的,因此如果您希望键按升序排列,则必须对键进行排序:

      for key in sorted(dict1.iterkeys(), key=lambda x: int(x)):
          writer.writerow([key] + [d[key] for d in dicts])
      

      如果您需要处理无法确定所有字典都具有相同键的情况,则需要更改一些小东西:

      with open('my_data.csv', 'wb') as ofile:
          writer = csv.writer(ofile, delimiter='\t')
          writer.writerow(['ID', 'dict1', 'dict2', 'dict3', 'dict4'])
          keys = set(d.keys() for d in dicts)
          for key in keys:
              writer.writerow([key] + [d.get(key, None) for d in dicts])
      

      【讨论】:

      • 如果不是每个dict 都存在key,则理解将失败。这对海报来说可能不是问题,但重要的是要注意。您可以使用defaultdict 或覆盖__missing__ 的自定义类而不是dicts,但只是尝试为dicts 中的每个d 访问d[key] 可能会引发KeyError。跨度>
      • 这取决于。如果期望所有 dicts 都包含所有键,那么 defaultdict 是正确的。
      • @EMS 如果您需要处理可能丢失的条目,请使用 d.get(key, None)
      • 如果您只想交换哨兵值,这是处理它们的一种方法。 __missing__ 让您做得更多。
      【解决方案3】:

      使用defaultdict(list)

      from collections import defaultdict
      merged_dict = defaultdict(list)
      dict_list = [dict1, dict2, dict3]
      
      for dict in dict_list:
          for k, v in dict.items():
              merged_dict[k].append(v)
      

      这就是你得到的:

      {0: [24.7548, 13.422, 32.2422], 1: [34.2422, 9.2308, 23.342], 2: [19.329, 20.132, 32.424]})
      

      然后将 merged_dict 写入 csv 文件,就像您之前对单个 dict 所做的那样。这次csv模块的writerow方法会有所帮助。

      【讨论】:

        【解决方案4】:

        我已经有一段时间没有使用 Python,但这是我的建议。 在 Python 中,字典值可以是任何类型(据我所知,如果我错了,请不要喷我)。至少应该可以将您的键映射到列表。

        所以你可以遍历你的字典,也许可以创建一个新字典'd',并且对于每个键,如果值已经在'd'中,则将值推送到'd'的值(因为关联的键是一个列表)。

        然后你可以把新字典写成:(伪代码) 对于每个键,字典中的值 写键 写制表符 对于每个 v 的值 写 v + TAB 写新行 结束

        虽然这不包括“标题名称”,但我相信这很容易添加。

        【讨论】:

          猜你喜欢
          • 2012-05-09
          • 2012-12-17
          • 2023-03-03
          • 1970-01-01
          • 2018-04-08
          • 2014-06-30
          • 2017-03-28
          • 1970-01-01
          相关资源
          最近更新 更多