将带有字典列表的 defaultdict(list) 字典转换为 csv 的最佳方法

Posted

技术标签:

【中文标题】将带有字典列表的 defaultdict(list) 字典转换为 csv 的最佳方法【英文标题】:Best way to convert a defaultdict(list) dictionary with list of dictionaries to a csv 【发布时间】:2022-01-20 01:23:05 【问题描述】:

我的默认字典有一个地址键,并且有一个与该键匹配的字典列表。我想将此默认字典导出到 csv 文件。

见下文:

Right now my structure looks like this defaultdict(list)
#As you can see 1 key with multiple matching dictionaries. 
#And im just copying 1 address but I have ~10 w/ varying matches

defaultdic1 = 

defaultdict(list,
            'Address_1': ['Name': 'name',
               'Address_match': 'address_match_1',
               'ID': 'id',
               'Type': 'abc',
              'Name': 'name',
               'Address_match': 'address_match_2',
               'ID': 'id',
               'Type': 'abc',
              'Name': 'name',
               'Address_match': 'address_match_3',
               'ID': 'id',
               'Type': 'abc'])

我试过这样做:

json_data = json.dumps(data_json, indent=2)

jsondf = pd.read_json(json_data, typ = 'series')

and my result was this:

Address 1       ['Name':'name', 'Address_match':'address_match_1' 'ID' : 'id', 'Type':'abc' 'Name':'name', 'Address_match':'address_match_2' 'ID' : 'id', 'Type':'abc', 'Name':'name', 'Address_match':'address_match_3' 'ID' : 'id', 'Type':'abc']

结果/输出:

我想把它导出到一个 excel 文件中

更新我试过了。第一行正在打印密钥,但第二行仍在 中,最好将它们从括号中取出并移到列中。有什么提示吗?

    for k, v in defaultdict.items():
        f.writerow([k])
        for values in v:
            f.writerow([values])

results in CSV are:

Address 1

'Name':'name', 'Address_match':'address_match_1' 'ID' : 'id', 'Type':'abc'
'Name':'name', 'Address_match':'address_match_1' 'ID' : 'id', 'Type':'abc'
'Name':'name', 'Address_match':'address_match_2' 'ID' : 'id', 'Type':'abc'

我希望我的结果是:

Address 1                Name, Address_match1, ID, Type
                         Name, Address_match2, ID, Type
                         Name, Address_match3, ID, Type

Address 2                Name1, Address_match1, ID, Type
                         Name1, Address_match1, ID, Type

Address 3                Name1, Address_match1, ID, Type
                         Name1, Address_match1, ID, Type

【问题讨论】:

您的第一个代码 sn-p 无法运行... 很抱歉,您的问题是什么? 我并不是要粗鲁,但您确实需要精确地指定您的输入和您想要的输出精确地 也许您应该使用for-loop 分别处理列表中的每个元素并将每个元素放在新行中。这不需要JSON 我在考虑for key, val in jsondefaultdic1.items(): for item in val: print(key, item)jsondefaultdic2也是如此 【参考方案1】:

您的输入数据和输出数据不匹配,因此很难判断如何转换,但这里有一些东西可以使用您的 defaultdict 并将其转换为 CSV 文件:

import csv

dic1 = 'Address_2': 
    [
        'Address 1': 
            [
                'Name':'name', 'Address_match':'address_match_1', 'ID':'id', 'Type':'abc'
            ]
        ,
        'Address 2': 
            [
                'Name':'name', 'Address_match':'address_match_2', 'ID':'id', 'Type':'abc'
            ]
        , 
        'Address 3': 
            [
                'Name':'name', 'Address_match':'address_match_3', 'ID':'id', 'Type':'abc'
            ]
        
    ]


names = list(dic1['Address_2'][0]['Address 1'][0].keys())

myfile = csv.DictWriter( open('xxx.csv','w'), fieldnames = names  )
for row in dic1['Address_2']:
    myfile.writerow('Name':list(row.keys())[0])
    myfile.writerow(list(row.values())[0][0])

【讨论】:

非常感谢这篇文章,我真的很感激。我调整了我的输入和输出,所以它们应该是匹配的。我还意识到我没有像您为 dict1 发布的字典格式,而是有一个字典,里面有一个字典列表。请查看我的更改。 这就是我的代码中的内容:一个带有字典列表的字典。 是的。我是 defaultdics(lists) 的新手。这对我有用 - > names = list(Address2'][0].keys()) ,但是 names = list(dic1['Address_2'][0]['Address 1'][0].keys())给我一个错误说'str'对象没有属性'keys'。我认为这是因为我有 1 个带地址的密钥。然后在那个钥匙里面我没有另一个钥匙。 嗯,有一些混乱,因为您目前在“见下文”中显示的内容根本不是字典。它是一个字典列表。您根本没有根目录下的“Address_2”。 是的,我在上面输入了 cmets (#),它只有 1 个地址,但我有 ~10 个。无论如何,感谢您的帮助,我能够解决它!真的很感激。我实际上没有使用 DictWriter 我是使用 writer 完成的。【参考方案2】:

这就是最终解决它的原因!

names = list(dic1['Address_1'][0].keys())
f.close()
with open ("file.csv", "w", newline="") as f:
    writer = csv.writer(f)
    keys = names
    writer.writerow(["Address"] +(keys))
    for k, vl in defaultdict.items():
        for v in vl:
            writer.writerow([k] + [v[key] for key in keys])
f.close()

【讨论】:

就像对未来的评论一样,请确保当您提出问题时,您的示例数据确实反映了您的示例数据。 @TimRoberts 会的!你的名字变量让我感动,没有你的帮助是做不到的。谢谢

以上是关于将带有字典列表的 defaultdict(list) 字典转换为 csv 的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

defaultdict

将字典复制到 defaultdict

从另一个defaultdict获取价值并更新原始字典

defaultdict(list) 将所有值连接到一个列表中

Python之字典中的键映射多个值

python cookbook第三版学习笔记二:字典