【问题标题】:How to write nested dictionaries to a CSV file如何将嵌套字典写入 CSV 文件
【发布时间】:2018-03-21 12:00:12
【问题描述】:

我有一本字典

count = {'lt60': {'a': 0, 'b': 0, 'c': 0, 'd': 0}, 'ge60le90': {'a': 4, 'b': 0, 'C': 0, 'd': 0}, 'gt90': {'a': 0, 'b': 1, 'c': 2, 'd': 1} }

我想把这本字典写成这样的 CSV 格式..正如你在这张图片中看到的那样

我想要的是从 lt60、ge60le90、gt90 中获取密钥,并希望将它们连续写入。就像我从所有嵌套字典中选择 'a' 及其值并将其值写入该行。

【问题讨论】:

  • @MikeScotty 我试过了,但它不起作用,为什么我问,因为我是 python 的初学者。
  • 如果您尝试过某事但“它不工作”,然后发布您的尝试(或至少一个 MCVE),并准确描述它是如何“不工作”的。也请用真正预期的 csv 替换您的 excel 屏幕截图(csv 是一种您知道的文本格式?)
  • @brunodesthuilliers 我是这个平台和 python 的新手 ..所以我不知道我还需要发布我的代码...实际上我正在尝试使用 csv 模块和我不知道如何从嵌套字典中获取键和值..:) 希望你能理解 :)

标签: python python-3.x csv dictionary opencsv


【解决方案1】:

您可以使用pandas 来执行此操作:

import pandas as pd

count = {'lt60': {'a': 0, 'b': 0, 'c': 0, 'd': 0},
         'ge60le90': {'a': 4, 'b': 0, 'c': 0, 'd': 0},
         'gt90': {'a': 0, 'b': 1, 'c': 2, 'd': 1} }

df = pd.DataFrame(count).rename_axis('relation_type').reset_index()

df = df.rename(columns={'ge60le90': 'confidence<90',
                        'gt90': 'confidence>90',
                        'lt60': 'confidence<60'})

df.to_csv('out.csv', index=False)

#   relation_type  confidence<90  confidence>90  confidence<60
# 0             a              4              0              0
# 1             b              0              1              0
# 2             c              0              2              0
# 3             d              0              1              0

【讨论】:

    【解决方案2】:

    另一种方法是使用csv 模块。 (请注意,在您的字典中,您有一个大写的 C,我在下面的代码中对其进行了更正):

    import csv
    
    lookup = {'ge60le90': 'confidence<90','gt90': 'confidence>90', 'lt60': 'confidence<60'}
    
    count = {'lt60': {'a': 0, 'b': 0, 'c': 0, 'd': 0}, 'ge60le90': {'a': 4, 'b': 0, 'c': 0, 'd': 0}, 'gt90': {'a': 0, 'b': 1, 'c': 2, 'd': 1} }
    
    # Getting keys from dictionary that match them with titles below.
    rowKeys = [k for k in count['lt60'].keys()] 
    titles = [['relation type'] + list(lookup[k] for k in count.keys())]
    
    # Getting all row variable values for every title.
    rows = [[count[k][i] for k in count.keys()] for i in rowKeys]
    
    # Concatenating variables and values.
    fields = [[rowKeys[i]] + rows[i] for i in range(len(rowKeys))]
    
    # Concatenating final output to be written to file.
    result = titles + fields
    print("Final result to be written: ")
    for r in result:
        print(r)
    
    # Writing to file.
    with open("output.csv", "w", newline="") as outFile:
        writer = csv.writer(outFile, delimiter=';',quotechar='|', quoting=csv.QUOTE_MINIMAL)
        writer.writerows(result)
    

    请注意,; 分隔符适用于欧洲 Windows,但可能不适用于您。在这种情况下,请改用,

    【讨论】:

    • "list([[count[k][i] for k in count.keys()] for i in rowKeys])" => list() 没用,arg 已经是列表
    【解决方案3】:

    这个问题可以通过迭代你的字典来提取你的键和这些键的值来简化

    count = {'lt60': {'a': 0, 'b': 0, 'c': 0, 'd': 0},
             'ge60le90': {'a': 4, 'b': 0, 'c': 0, 'd': 0},
             'gt90': {'a': 0, 'b': 1, 'c': 2, 'd': 1} }
    
    # Create outfile
    f = open("C:\\Users\\<USER>\\Desktop\\OUT.csv","w")
    # Write first row
    f.write(",a,b,c,d\n")
    
    # Iterate through keys
    for keys in count:
        print(keys)
        f.write(keys + ",")
    
        KEYS = count[keys]
    # Iterate though values
        for values in KEYS:
            print(KEYS[values])
            f.write(str(KEYS[values]) + ",")
        f.write("\n")
    f.close()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-12
      • 2018-10-27
      • 2015-06-06
      • 1970-01-01
      • 2023-03-19
      • 2013-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多