递归搜索字典后,添加键/值对

时间:2019-03-15 14:11:39

标签: python dictionary recursion

我已经在嵌套字典中搜索了某些键,我已经能够找到想要的键,但是我不确定现在如何将键/值对添加到我要的位置寻找的是。有没有办法告诉python将数据条目附加到当前正在查看的位置?

代码:

import os
import json
import shutil
import re
import fileinput
from collections import OrderedDict

#Finds and lists the folders that have been provided
d='.'
folders = list(filter (lambda x: os.path.isdir(os.path.join(d, x)), os.listdir(d)))
print("Folders found: ")
print(folders)
print("\n")


def processModelFolder(inFolder):

#Creating the file names 
    fileName = os.path.join(d, inFolder, inFolder + ".mdl")
    fileNameTwo = os.path.join(d, inFolder, inFolder + ".vg2.json")
    fileNameThree = os.path.join(d, inFolder, inFolder + "APPENDED.vg2.json")
#copying the json file so the new copy can be appended
    shutil.copyfile(fileNameTwo, fileNameThree)
#assigning IDs and properties to search for in the mdl file
    IDs = ["7f034e5c-24df-4145-bab8-601f49b43b50"]
    Properties = ["IDSU_FX[0]"]
#Basic check to see if IDs and Properties are valid
    for i in IDs:
             if len(i) != 36:
                print("ID may not have been valid and might not return the results you expect, check to ensure the characters are correct: ")
                print(i)
                print("\n")
    if len(IDs) == 0:
        print("No IDs were given!")
    elif len(Properties) == 0:
        print("No Properties were given!")
#Reads code untill an ID is found           
    else:
        with open(fileName , "r") as in_file:

            IDCO = None
            for n, line in enumerate(in_file, 1):
                if line.startswith('IDCO_IDENTIFICATION'):
                    #Checks if the second part of each line is a ID tag in IDs
                    if line.split('"')[1] in IDs:
                        #If ID found it is stored as IDCO
                        IDCO = line.split('"')[1]
                    else:
                        if IDCO:
                            pass
                            IDCO = None
                #Checks if the first part of each line is a Prop in Propterties
                elif IDCO and line.split(' ')[0] in Properties:
                    print('Found! ID:{} Prop:{} Value: {}'.format(IDCO, line.split('=')[0][:-1], line.split('=')[1][:-1]))
                    print("\n")
                    #Stores the property name and value
                    name = str(line.split(' ')[0])
                    value = str(line.split(' ')[2])
                    #creates the entry to be appended to the dict
                    #json file editing        
                    with open(fileNameThree , "r+") as json_data:
                        python_obj = json.load(json_data)
                    #calling recursive search
                    get_recursively(python_obj, IDCO, name, value)




    with open(fileNameThree , "w") as json_data:
        json.dump(python_obj, json_data, indent = 1)



        print('Processed {} lines in file: {}'.format(n , fileName))

def get_recursively(search_dict, IDCO, name, value):
    """
    Takes a dict with nested lists and dicts,
    and searches all dicts for a key of the field
    provided, when key "id" is found it checks to,
    see if its value is the current IDCO tag, if so it appends the new data.
    """
    fields_found = []

    for key, value in search_dict.iteritems():

        if key == "id":
            if value == IDCO:
                print("FOUND IDCO IN JSON: " + value +"\n")
        elif isinstance(value, dict):
            results = get_recursively(value, IDCO, name, value)
            for result in results:
                x = 1
        elif isinstance(value, list): 
            for item in value:
                if isinstance(item, dict):
                    more_results = get_recursively(item, IDCO, name, value)
                    for another_result in more_results:
                        x=1
    return fields_found



for modelFolder in folders:
    processModelFolder(modelFolder)

简而言之,一旦找到我想要的键/ ID值对,我可以告诉它直接将名称/值附加到该位置,然后继续吗?

嵌套字典:

{
  "id": "79cb20b0-02be-42c7-9b45-96407c888dc2",
  "tenantId": "00000000-0000-0000-0000-000000000000",
  "name": "2-stufiges Stirnradgetriebe",
  "description": null,
  "visibility": "None",
  "method": "IDM_CALCULATE_GEAR_COUPLED",
  "created": "2018-10-16T10:25:20.874Z",
  "createdBy": "00000000-0000-0000-0000-000000000000",
  "lastModified": "2018-10-16T10:25:28.226Z",
  "lastModifiedBy": "00000000-0000-0000-0000-000000000000",
  "client": "STRING_BEARINX_ONLINE",
  "project": {
    "id": "10c37dcc-0e4e-4c4d-a6d6-12cf65cceaf9",
    "name": "proj 2",
    "isBookmarked": false
  },
  "rootObject": {
    "id": "6ff0010c-00fe-485b-b695-4ddd6aca4dcd",
    "type": "IDO_GEAR",
    "children": [
      {
        "id": "1dd94d1a-e52d-40b3-a82b-6db02a8fbbab",
        "type": "IDO_SYSTEM_LOADCASE",
        "children": [],
        "childList": "SYSTEMLOADCASE",
        "properties": [
          {
            "name": "IDCO_IDENTIFICATION",
            "value": "1dd94d1a-e52d-40b3-a82b-6db02a8fbbab"
          },
          {
            "name": "IDCO_DESIGNATION",
            "value": "Lastfall 1"
          },
          {
            "name": "IDSLC_TIME_PORTION",
            "value": 100
          },
          {
            "name": "IDSLC_DISTANCE_PORTION",
            "value": 100
          },
          {
            "name": "IDSLC_OPERATING_TIME_IN_HOURS",
            "value": 1
          },
          {
            "name": "IDSLC_OPERATING_TIME_IN_SECONDS",
            "value": 3600
          },
          {
            "name": "IDSLC_OPERATING_REVOLUTIONS",
            "value": 1
          },
          {
            "name": "IDSLC_OPERATING_DISTANCE",
            "value": 1
          },
          {
            "name": "IDSLC_ACCELERATION",
            "value": 9.81
          },
          {
            "name": "IDSLC_EPSILON_X",
            "value": 0
          },
          {
            "name": "IDSLC_EPSILON_Y",
            "value": 0
          },
          {
            "name": "IDSLC_EPSILON_Z",
            "value": 0
          },
          {
            "name": "IDSLC_CALCULATION_WITH_OWN_WEIGHT",
            "value": "CO_CALCULATION_WITHOUT_OWN_WEIGHT"
          },
          {
            "name": "IDSLC_CALCULATION_WITH_TEMPERATURE",
            "value": "CO_CALCULATION_WITH_TEMPERATURE"
          },
          {
            "name": "IDSLC_FLAG_FOR_LOADCASE_CALCULATION",
            "value": "LB_CALCULATE_LOADCASE"
          },
          {
            "name": "IDSLC_STATUS_OF_LOADCASE_CALCULATION",
            "value": false
          }
        ],
        "position": 1,
        "order": 1,
        "support_vector": {
          "x": 0,
          "y": 0,
          "z": 0
        },
        "u_axis_vector": {
          "x": 1,
          "y": 0,
          "z": 0
        },
        "w_axis_vector": {
          "x": 0,
          "y": 0,
          "z": 1
        },
        "role": "_none_"
      },
      {
        "id": "ab7fbf37-17bb-4e60-a543-634571a0fd73",
        "type": "IDO_SHAFT_SYSTEM",
        "children": [
          {
            "id": "7f034e5c-24df-4145-bab8-601f49b43b50",
            "type": "IDO_RADIAL_ROLLER_BEARING",
            "children": [
              {
                "id": "0b3e695b-6028-43af-874d-4826ab60dd3f",
                "type": "IDO_RADIAL_BEARING_INNER_RING",
                "children": [
                  {
                    "id": "330aa09d-60fb-40d7-a190-64264b3d44b7",
                    "type": "IDO_LOADCONTAINER",
                    "children": [
                      {
                        "id": "03036040-fc1a-4e52-8a69-d658e18a8d4a",
                        "type": "IDO_DISPLACEMENT",
                        "children": [],
                        "childList": "DISPLACEMENT",
                        "properties": [
                          {
                            "name": "IDCO_IDENTIFICATION",
                            "value": "03036040-fc1a-4e52-8a69-d658e18a8d4a"
                          },
                          {
                            "name": "IDCO_DESIGNATION",
                            "value": "Displacement 1"
                          }
                        ],
                        "position": 1,
                        "order": 1,
                        "support_vector": {
                          "x": -201.3,
                          "y": 0,
                          "z": -229.8
                        },
                        "u_axis_vector": {
                          "x": 1,
                          "y": 0,
                          "z": 0
                        },
                        "w_axis_vector": {
                          "x": 0,
                          "y": 0,
                          "z": 1
                        },
                        "shaftSystemId": "ab7fbf37-17bb-4e60-a543-634571a0fd73",
                        "role": "_none_"
                      },
                      {
                        "id": "485f5bf4-fb97-415b-8b42-b46e9be080da",
                        "type": "IDO_CUMULATED_LOAD",
                        "children": [],
                        "childList": "CUMULATEDLOAD",
                        "properties": [
                          {
                            "name": "IDCO_IDENTIFICATION",
                            "value": "485f5bf4-fb97-415b-8b42-b46e9be080da"
                          },
                          {
                            "name": "IDCO_DESIGNATION",
                            "value": "Cumulated load 1"
                          },
                          {
                            "name": "IDCO_X",
                            "value": 0
                          },
                          {
                            "name": "IDCO_Y",
                            "value": 0
                          },
                          {
                            "name": "IDCO_Z",
                            "value": 0
                          }
                        ],
                        "position": 2,
                        "order": 1,
                        "support_vector": {
                          "x": -201.3,
                          "y": 0,
                          "z": -229.8
                        },
                        "u_axis_vector": {
                          "x": 1,
                          "y": 0,
                          "z": 0
                        },
                        "w_axis_vector": {
                          "x": 0,
                          "y": 0,
                          "z": 1
                        },
                        "shaftSystemId": "ab7fbf37-17bb-4e60-a543-634571a0fd73",
                        "role": "_none_"
                      }
                    ],
                    "childList": "LOADCONTAINER",
                    "properties": [
                      {
                        "name": "IDCO_IDENTIFICATION",
                        "value": "330aa09d-60fb-40d7-a190-64264b3d44b7"
                      },
                      {
                        "name": "IDCO_DESIGNATION",
                        "value": "Load container 1"
                      },
                      {
                        "name": "IDLC_LOAD_DISPLACEMENT_COMBINATION",
                        "value": "LOAD_MOMENT"
                      },
                      {
                        "name": "IDLC_TYPE_OF_MOVEMENT",
                        "value": "LB_ROTATING"
                      },
                      {
                        "name": "IDLC_NUMBER_OF_ARRAY_ELEMENTS",
                        "value": 20
                      }
                    ],
                    "position": 1,
                    "order": 1,
                    "support_vector": {
                      "x": -201.3,
                      "y": 0,
                      "z": -229.8
                    },
                    "u_axis_vector": {
                      "x": 1,
                      "y": 0,
                      "z": 0
                    },
                    "w_axis_vector": {
                      "x": 0,
                      "y": 0,
                      "z": 1
                    },
                    "shaftSystemId": "ab7fbf37-17bb-4e60-a543-634571a0fd73",
                    "role": "_none_"
                  },
                  {
                    "id": "3258d217-e6e4-4a5c-8677-ae1fca26f21e",
                    "type": "IDO_RACEWAY",
                    "children": [],
                    "childList": "RACEWAY",
                    "properties": [
                      {
                        "name": "IDCO_IDENTIFICATION",
                        "value": "3258d217-e6e4-4a5c-8677-ae1fca26f21e"
                      },
                      {
                        "name": "IDCO_DESIGNATION",
                        "value": "Raceway 1"
                      },
                      {
                        "name": "IDRCW_UPPER_DEVIATION_RACEWAY_DIAMETER",
                        "value": 0
                      },
                      {
                        "name": "IDRCW_LOWER_DEVIATION_RACEWAY_DIAMETER",
                        "value": 0
                      },
                      {
                        "name": "IDRCW_PROFILE_OFFSET",
                        "value": 0
                      },
                      {
                        "name": "IDRCW_PROFILE_ANGLE",
                        "value": 0
                      },
                      {
                        "name": "IDRCW_PROFILE_CURVATURE_RADIUS",
                        "value": 0
                      },
                      {
                        "name": "IDRCW_PROFILE_CENTER_POINT_OFFSET",
                        "value": 0
                      },
                      {
                        "name": "IDRCW_PROFILE_NUMBER_OF_WAVES",
                        "value": 0
                      },
                      {
                        "name": "IDRCW_PROFILE_AMPLITUDE",
                        "value": 0
                      },
                      {
                        "name": "IDRCW_PROFILE_POSITION_OF_FIRST_WAVE",
                        "value": 0
                      },

1 个答案:

答案 0 :(得分:0)

错误

首先,将value变量的名称替换为其他名称,因为迭代时,您有一个value变量作为方法参数,另一个value变量具有相同的名称。字典:

for key, value in search_dict.iteritems(): # <-- REPLACE value TO SOMETHING ELSE LIKE val

否则,您将遇到错误,因为字典中的value是您要插入的新值。但是,如果您像for key, val in那样进行迭代,则实际上可以使用外部value变量。

添加值对

看来idsearch_dict内部的密钥,但是在读取JSON文件时,search_dict可能有多个嵌套列表,例如properties和/或{{1} },因此这取决于您要在其中添加新对的位置。

如果要将其添加到children所在的词典中:

id

结果:

if key == "id":
    if value == IDCO:
        print("FOUND IDCO IN JSON: " + value +"\n")
        search_dict[name] = value

如果要将其添加到{ "id": "3258d217-e6e4-4a5c-8677-ae1fca26f21e", "type": "IDO_RACEWAY", "children": [], "childList": "RACEWAY", "<new name>": "<new value>", "properties": [ { "name": "IDCO_IDENTIFICATION", "value": "3258d217-e6e4-4a5c-8677-ae1fca26f21e" }, 为以下字典的childrenproperties 列表中:

id

结果:

if key == "id":
    if value == IDCO:
        print("FOUND IDCO IN JSON: " + value +"\n")
        if search_dict.has_key("properties"): # you can swap "properties" to "children", depends on your use case
            search_dict["properties"].append({"name": name, "value": value}) # a new dictionary with 'name' and 'value' keys