一旦我递归搜索了一个字典,就添加一个键/值对

问题描述 投票:0回答:1

我已经搜索了嵌套的dict中的某些键,我已经成功找到了我想要的键,但我不知道如何才能将键/值对添加到我要查找的键所在的位置。有没有办法告诉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
                      },
python dictionary recursion
1个回答
0
投票

窃听器

首先,用其他东西替换value变量的名称,因为在迭代字典时你有一个value变量作为方法参数和另一个同名的value变量:

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

否则你会有bug,因为字典中的value是你要插入的新值。但如果你像for key, val in那样迭代,那么你实际上可以使用外部的value变量。

添加值对

看来id是你的search_dict里面的一个关键,但是读你的JSON文件你的search_dict可能有几个嵌套列表,比如properties和/或children,所以它取决于你想要添加新对的位置。

If you want to add it to the same dictionary where your id is:

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"
      },

If you want to add it to the children or properties list inside the dictionary where id is:

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

结果:

{
    "id": "3258d217-e6e4-4a5c-8677-ae1fca26f21e",
    "type": "IDO_RACEWAY",
    "children": [],
    "childList": "RACEWAY",
    "properties": [
      {
        "name": "IDCO_IDENTIFICATION",
        "value": "3258d217-e6e4-4a5c-8677-ae1fca26f21e"
      },
      {
        "name": "<new name>",
        "value": "<new value>"
      },
© www.soinside.com 2019 - 2024. All rights reserved.