【问题标题】:Adding a key/value pair once I have recursively searched a dict递归搜索字典后添加键/值对
【发布时间】:2019-03-15 14:11:39
【问题描述】:

我已经在嵌套字典中搜索了某些键,我成功地找到了我正在寻找的键,但是我不确定现在如何将键/值对添加到我所在的键的位置寻找的是。有没有办法告诉 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
                      },

【问题讨论】:

  • (key, value) 添加到字典dicdic[key] = value
  • 我刚刚添加了嵌套字典的前 300 行,我遇到的问题是包含我想要经常更改的 id 的字典,我需要一种将 id 附加到位置的方法发现于,如果我尝试这些解决方案,它只会将条目添加到第一级
  • 您是说您有一本字典,并且在该字典中您有 (key, value) 对,其中值 also 是字典?因此,您需要dic[key][new_key] = new_value,其中(new_key, new_value) 是您要添加到第一级由key 标识的嵌套字典中的新对。

标签: python dictionary recursion


【解决方案1】:

错误

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

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

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

添加价值对

似乎id 是您的search_dict 中的一个键,但读取您的JSON 文件时您的search_dict 可能有几个嵌套列表,例如properties 和/或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

结果:

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

【讨论】:

  • 谢谢,但是当它添加值时,它会添加这个{ "name": "IDSU_FX[0]", "value": "0.01\n" },我不知道为什么
  • 请在分配给processModelFolder 函数时检查namevalue 变量的值。您可以执行print(name)print(value) 并检查控制台。
  • 我仔细检查了它们,它们打印为name: IDSU_FX[0] value: 0.01
猜你喜欢
  • 2017-12-02
  • 2018-09-28
  • 2012-07-08
  • 2016-11-22
  • 2016-08-16
  • 2020-12-17
  • 2013-04-15
  • 2019-07-30
  • 1970-01-01
相关资源
最近更新 更多