2017-10-05 52 views
0

コーパスを処理する理由(科学的名前抽出にGNRD http://gnrd.globalnames.org/を使用)のために、複数のJSONファイルを作成する必要がありました。これらのJSONファイルを使用して、コーパス全体に注釈を付けることにしました。Pythonで複数のJSONファイルをマージする方法

私はPythonで複数のJSONファイルをマージしようとしています。各JSONファイルの内容は、単にscientific_name(key)とfound(value)という名前の配列です。以下は短いのいずれかのファイルの例です。

{ 
    "file":"biodiversity_trophic_9.txt", 
    "names":[ 
    { 
     "scientificName":"Bufo" 
    }, 
    { 
     "scientificName":"Eleutherodactylus talamancae" 
    }, 
    { 
     "scientificName":"E. punctariolus" 
    }, 
    { 
     "scientificName":"Norops lionotus" 
    }, 
    { 
     "scientificName":"Centrolenella prosoblepon" 
    }, 
    { 
     "scientificName":"Sibon annulatus" 
    }, 
    { 
     "scientificName":"Colostethus flotator" 
    }, 
    { 
     "scientificName":"C. inguinalis" 
    }, 
    { 
     "scientificName":"Eleutherodactylus" 
    }, 
    { 
     "scientificName":"Hyla columba" 
    }, 
    { 
     "scientificName":"Bufo haematiticus" 
    }, 
    { 
     "scientificName":"S. annulatus" 
    }, 
    { 
     "scientificName":"Leptodeira septentrionalis" 
    }, 
    { 
     "scientificName":"Imantodes cenchoa" 
    }, 
    { 
     "scientificName":"Oxybelis brevirostris" 
    }, 
    { 
     "scientificName":"Cressa" 
    }, 
    { 
     "scientificName":"Coloma" 
    }, 
    { 
     "scientificName":"Perlidae" 
    }, 
    { 
     "scientificName":"Hydropsychidae" 
    }, 
    { 
     "scientificName":"Hyla" 
    }, 
    { 
     "scientificName":"Norops" 
    }, 
    { 
     "scientificName":"Hyla colymbiphyllum" 
    }, 
    { 
     "scientificName":"Colostethus inguinalis" 
    }, 
    { 
     "scientificName":"Oxybelis" 
    }, 
    { 
     "scientificName":"Rana warszewitschii" 
    }, 
    { 
     "scientificName":"R. warszewitschii" 
    }, 
    { 
     "scientificName":"Rhyacophilidae" 
    }, 
    { 
     "scientificName":"Daphnia magna" 
    }, 
    { 
     "scientificName":"Hyla colymba" 
    }, 
    { 
     "scientificName":"Centrolenella" 
    }, 
    { 
     "scientificName":"Orconectes nais" 
    }, 
    { 
     "scientificName":"Orconectes neglectus" 
    }, 
    { 
     "scientificName":"Campostoma anomalum" 
    }, 
    { 
     "scientificName":"Caridina" 
    }, 
    { 
     "scientificName":"Decapoda" 
    }, 
    { 
     "scientificName":"Atyidae" 
    }, 
    { 
     "scientificName":"Cerastoderma edule" 
    }, 
    { 
     "scientificName":"Rana aurora" 
    }, 
    { 
     "scientificName":"Riffle" 
    }, 
    { 
     "scientificName":"Calopterygidae" 
    }, 
    { 
     "scientificName":"Elmidae" 
    }, 
    { 
     "scientificName":"Gyrinidae" 
    }, 
    { 
     "scientificName":"Gerridae" 
    }, 
    { 
     "scientificName":"Naucoridae" 
    }, 
    { 
     "scientificName":"Oligochaeta" 
    }, 
    { 
     "scientificName":"Veliidae" 
    }, 
    { 
     "scientificName":"Libellulidae" 
    }, 
    { 
     "scientificName":"Philopotamidae" 
    }, 
    { 
     "scientificName":"Ephemeroptera" 
    }, 
    { 
     "scientificName":"Psephenidae" 
    }, 
    { 
     "scientificName":"Baetidae" 
    }, 
    { 
     "scientificName":"Corduliidae" 
    }, 
    { 
     "scientificName":"Zygoptera" 
    }, 
    { 
     "scientificName":"B. buto" 
    }, 
    { 
     "scientificName":"C. euknemos" 
    }, 
    { 
     "scientificName":"C. ilex" 
    }, 
    { 
     "scientificName":"E. padi noblei" 
    }, 
    { 
     "scientificName":"E. padi" 
    }, 
    { 
     "scientificName":"E. bufo" 
    }, 
    { 
     "scientificName":"E. butoni" 
    }, 
    { 
     "scientificName":"E. crassi" 
    }, 
    { 
     "scientificName":"E. cruentus" 
    }, 
    { 
     "scientificName":"H. colymbiphyllum" 
    }, 
    { 
     "scientificName":"N. aterina" 
    }, 
    { 
     "scientificName":"S. ilex" 
    }, 
    { 
     "scientificName":"Anisoptera" 
    }, 
    { 
     "scientificName":"Riffle delta" 
    } 
    ], 
    "total":67, 
    "status":200, 
    "unique":true, 
    "engines":[ 
    "TaxonFinder", 
    "NetiNeti" 
    ], 
    "verbatim":false, 
    "input_url":null, 
    "token_url":"http://gnrd.globalnames.org/name_finder.html?token=2rtc4e70st", 
    "parameters":{ 
    "engine":0, 
    "return_content":false, 
    "best_match_only":false, 
    "data_source_ids":[ 

    ], 
    "detect_language":true, 
    "all_data_sources":false, 
    "preferred_data_sources":[ 

    ] 
    }, 
    "execution_time":{ 
    "total_duration":3.1727607250213623, 
    "find_names_duration":1.9656541347503662, 
    "text_preparation_duration":1.000107765197754 
    }, 
    "english_detected":true 
} 

私が持っている問題は、(そうでない場合、私はちょうど私が推測するファイルを連結できる)私は削除したいファイル、全体で重複があるかもしれないことです。私が他に見てきたクエリは、配列自体を拡張するために余分なキーと値をマージすることを指しています。

誰も私にこの問題を克服する方法のガイダンスを教えてもらえますか?

+3

として、パイソンにJSONファイルをロードどんなオブジェクトタイプでも表現できます。次に、必要なロジックを使用してそれらのオブジェクトをマージします(一般的な「これらのルールをマージしてください。マージすることが意味をなさない方法/結果のオブジェクトを表示する方法を決定する必要があります)。その後、その結合されたオブジェクトをJsonにシリアル化します。 – Bilkokuya

+1

期待される結果の例を挙げることはできますか? – Don

+0

ありがとうございます。期待される結果は、すべてのファイルを1つにすることです。好ましくは、重複がコーパスで実行したい後続の注釈に問題を引き起こす可能性があると思われるので、重複を削除してください。すべてのファイルは上記のとおりですが、各ファイルには15個のファイルがあり、それぞれのファイルにはエントリ数、検索に要した時間などが記載されています。最初に各ファイルから手動で削除するのが最善でしょうか? –

答えて

0

私が正しく理解していれば、バッチファイルの "names"要素に "scientificNames"の値をすべて入れたいと思っています。私が間違っていると、物事を理解しやすくするために期待される出力を与えるべきです。

all_names = set() # use a set to avoid duplicates 

# put all your files in there 
for filename in ('file1.json', 'file2.json', ....): 
    try: 
     with open(filename, 'rt') as finput: 
      data = json.load(finput) 
     for name in data.get('names'): 
      all_names.add(name.get('scientificName') 
    except Exception as exc: 
     print("Skipped file {} because exception {}".format(filename, str(exc)) 

print(all_names) 

そして場合には、あなたが最初のファイルよりも同様の形式を取得したい、追加:私はそのような何かをしたい

import pprint 
pprint({"names:": {"scientificName": name for name in all_names}, "total": len(all_names)}) 
関連する問題