2017-06-12 7 views
-1

タイトルに記載されているとおり、私は次のように端末から実行できる単純なpyスクリプトを作成しようとしています:Python 2.7:値のJSONファイル検索を読み込み、置き換えて、新しいJSONとして保存します

  • 負荷値が一致している場合は、ファイル
  • が再帰的に特定の値またはサブ
  • のためにそれらを検索すると(この部分はうまく動作します)現在の作業ディレクトリとネストされたフォルダ内のすべてのJSONファイルを探します、ユーザーによって新しい確立された値に置き換えてください。
  • 終了したら、変更されたすべてのjsonファイルを現在のディレクトリの "変換済み"フォルダに保存します。

これは、問題は、私がかなり多くのPythonに慣れているので、私は以下の再帰的検索方法を試してみることです。この問題の助けに感謝します。私が使用しているjsonファイルまたは私が採用している検索方法。

問題を単純化すると、値iの検索はオブジェクト内のものと決して一致しません。それはキーかまったくの文字列値です。再帰的な検索を実行するために複数のメソッドを試しましたが、一致を得ることはできません。

たとえば、サンプルjsonを考慮に入れて、値 "selectable_parts"または "static_parts"を置き換えるか、構造体 "1h_mod310_door_00"の深さを置き換えたいのですが、私の検索方法がこの値に到達できないようです"オブジェクト[オブジェクト] [子供] [0] [子供] [5] [名前]"(これが助けて欲しい)

サンプルJSON:(https://drive.google.com/open?id=0B2-Bn2b0ujjVdW5YVGg3REg3OWs


"""KEYWORD REPLACING MODULE.""" 
import os 
import json 

# functions 
def get_files(): 
    """lists files""" 
    exclude = set(['.vscode', 'sample']) 
    json_files = [] 
    for root, dirs, files in os.walk(os.getcwd(), topdown=True): 
     dirs[:] = [d for d in dirs if d not in exclude] 
     for name in files: 
      if name.endswith('.json'): 
       json_files.append(os.path.join(root, name)) 
    return json_files 

def load_files(json_files): 
    """works files""" 
    for js_file in json_files: 
     with open(js_file) as json_file: 
      loaded_json = json.load(json_file) 
      replace_key_value(loaded_json, os.path.basename(js_file)) 

def write_file(data_file, new_file_name): 
    """writes the file""" 
    if not os.path.exists('converted'): 
     os.makedirs('converted') 
    with open('converted/' + new_file_name, 'w') as json_file: 
     json.dump(data_file, json_file) 

def replace_key_value(js_file, js_file_name): 
    """replace and initiate save""" 
    recursive_replace(js_file, SKEY, '') 
    # write_file(js_file, js_file_name) 

def recursive_replace(data, match, repl): 
    """search for needed value and replace its value""" 
    for key, value in data.items(): 
     if value == match: 
      print data[key] 
      print "AHHHHHHHH" 
     elif isinstance(value, dict): 
      recursive_replace(value, match, repl) 

# main 
print "\n" + '- on ' + os.getcwd() 
NEW_DIR = raw_input('Work dir (leave empty if current): ') 
if not NEW_DIR: 
    print NEW_DIR 
    NEW_DIR = os.getcwd() 
else: 
    print NEW_DIR 
    os.chdir(NEW_DIR) 

# get_files() 
JS_FILES = get_files() 
print '- files on ' + os.getcwd() 
# print "\n".join(JS_FILES) 
SKEY = raw_input('Value to search: ') 
RKEY = raw_input('Replacement value: ') 
load_files(JS_FILES) 
+0

あなたはいくつかの言葉を残したようです。問題は何ですか? – khelwood

+0

問題を編集しますが、ロードされたjsonファイルからオブジェクトを検索して、その値が一致しない検索パラメータと一致するようにしてください。 オブジェクトをナビゲートして印刷することはできますが、値は検索するパラメータと決して一致しません。 – user1820904

答えて

0

は問題は方法が思いやりなかったので、それは辞書やリストだった場合、私は(私は信じているJSONのOBJをナビゲートする方法でした。.. )。

だからここに私自身の質問に答えるために、私は値をチェックするために使用している再帰的な検索です:これは誰かに役立ちます

def get_recursively(search_dict, field): 
    """ 
    Takes a dict with nested lists and dicts, 
    and searches all dicts for a key of the field 
    provided. 
    """ 
    fields_found = [] 

    for key, value in search_dict.iteritems(): 

     if key == field: 
      print value 
      fields_found.append(value) 

     elif isinstance(value, dict): 
      results = get_recursively(value, field) 
      for result in results: 
       if SEARCH_KEY in result: 
        fields_found.append(result) 

     elif isinstance(value, list): 
      for item in value: 
       if isinstance(item, dict): 
        more_results = get_recursively(item, field) 
        for another_result in more_results: 
         if SEARCH_KEY in another_result: 
          fields_found.append(another_result) 

    return fields_found 
    # write_file(js_file, js_file_name) 

ホープ。

関連する問題