Python 在嵌套字典中查找所有键和键的键

Python 在嵌套字典中查找所有键和键的键,python,json,dictionary,key,Python,Json,Dictionary,Key,我试图在Python的嵌套字典中查找数据的所有属性。某些对象的关键点定义中可能有多个级别。我如何才能找到如此复杂的嵌套数据的标题(如果我们认为是表结构的话)。以下是我的几行数据,以了解其外观: {"MessageType": "SALES.HOLDCREATED", "Event": {"Id": "ZWbDoMKQw6HDjFzCo8KuwpNmwofCjl7Co8OPwpDCncOSXMOdccKTZVVWZWbCnA==", "RefInfo": {"TId": {"Id": "ZMKXw

我试图在Python的嵌套字典中查找数据的所有属性。某些对象的关键点定义中可能有多个级别。我如何才能找到如此复杂的嵌套数据的标题(如果我们认为是表结构的话)。以下是我的几行数据,以了解其外观:

{"MessageType": "SALES.HOLDCREATED", "Event": {"Id": "ZWbDoMKQw6HDjFzCo8KuwpNmwofCjl7Co8OPwpDCncOSXMOdccKTZVVWZWbCnA==", "RefInfo": {"TId": {"Id": "ZMKXwpbClsOhwpNiw5E="}, "UserId": {"Id": "wpzCksKWwpbCpMKTYsKeZMKZbA=="}, "SentUtc": "2013-04-28T16:59:48.6698042", "Source": 1}, "ItemId": {"Id": 116228}, "Quantity": 1, "ExpirationDate": "2013-04-29T", "Description": null}}
{"MessageType": "SALES.SALEITEMCREATED", "Event": {"Id": "ZWbDoMKQw6HDjFzCo8KuwpNmwofCjl7Co8OPwpDCncOSXMOdccKTwp3CiFZkZMKWwpfCpMKZ", "RefInfo": {"TId": {"Id": "ZGA="}, "UserId": {"Id": "ZMKj"}, "SentUtc": "2013-01-04T", "Source": 1}, "Code": {"Code": "074108235206"}, "Sku": {"Sku": "Con CS54"}}}
{"MessageType": "SALES.SALEITEMCREATED", "Event": {"Id": "ZWbDoMKQw6HDjFzCo8KuwpNmwofCjl7Co8OPwpDCncOSXMOdccKTZcKHVsKcwpjClsKXwqTCmQ==", "RefInfo": {"TId": {"Id": "ZGA="}, "UserId": {"Id": "ZMKj"}, "SentUtc": "2013-01-04T", "Source": 1}, "Code": {"Code": "4000000021"}, "Sku": {"Sku": "NFL-Wallet-MK-2201"}}}
由于此数据是Json格式的,我首先更改了格式并尝试查找密钥:

import json

data = []
with open("data.raw", "r") as f:
    for line in f:
        data.append(json.loads(line))

for lines in data:
    print(lines.keys())
但是它给了我所有行的
dict_键(['Event','MessageType'])
。 我需要的(对于我所附的数据)是如下列表:

'MessageType' 'Event_Id' 'Event_RefInfo_TId_Id'  'Event_RefInfo_UserId_Id' 'Event_RefInfo_SentUtc' 'Event_RefInfo_Source' 'Event_ItemId_Id' 'Event_ItemId_Quantity' 'Event_ItemId_ExpirationDate'     ...

数据非常大,我只需要找出我有哪些属性。

您需要遍历嵌套的dict,您当前的方法只能到达根字典的键

可以使用以下生成器函数查找键并递归遍历嵌套的dict:

import json 
from pprint import pprint

def find_keys(dct):
    for k, v in dct.items():
        if isinstance(v, dict):
            # traverse nested dict
            for x in find_keys(v):
                yield "{}_{}".format(k, x)
        else:
            yield k
给定一个从json对象派生的字典列表,您可以在每个dict中找到键,并将它们放入一个集合中,以便条目是唯一的:

s = set()
for d in json.loads(lst):
    s.update(find_keys(d))

pprint(s)


非常感谢你。这个功能运行得很好。这里有一个问题。。。当我将这个方法应用于数据大小时,我可以将它读入我的内存,这没关系。当我想要处理大数据时,新问题就会出现。因为我必须使用readlines()来定义字符串列表,尽管我在打开文件时定义了缓冲区大小,但它会读取整个文件(而不是唯一的缓冲区大小)。如何仅读取在open函数的缓冲区大小中定义的数据段?
set(['Event_Code_Code',
     'Event_Description',
     'Event_ExpirationDate',
     'Event_Id',
     'Event_ItemId_Id',
     'Event_Quantity',
     'Event_RefInfo_SentUtc',
     'Event_RefInfo_Source',
     'Event_RefInfo_TId_Id',
     'Event_RefInfo_UserId_Id',
     'Event_Sku_Sku',
     'MessageType'])