Was ist der effizienteste Weg, um Informationen aus komplexen JSON-Dateien zu extrahieren?

Ich bin neu in Python und arbeite daran, bestimmte Informationen aus Dict-Dateien zu extrahieren.

Ich habe Millionen von JSON-Dateien, die Textdaten speichern. Alle JSON-Dateien haben ähnliche Strukturen. Es gibt viele Variationen in der Struktur. Für jede JSON-Datei möchte ich alle Textstrings aus einem bestimmten Schlüssel extrahieren und als Dict speichern.

json1 und json2 unten sind vereinfachte Beispiele. Was ich getan habe, ist, ein Beispiel aus den JSON-Dateien zu machen, zu analysieren, schreiben Sie eine Menge von if-Aussagen mit einem Versuch, alle möglichen Variationen einzuschließen. Allerdings finde ich es ineffizient und bin immer noch nicht in der Lage, alle Szenarien einzuschließen. Ich frage mich, ob es eine allgemeine Möglichkeit gibt, die Werte mit dem Schlüssel "text" zu durchsuchen und zu extrahieren.

 json1 = { "section": { "heading":{"lvl":"A1", "text":"today"}, "paragraph":[ {"color":"green", "text":"yesterday"}, {"color":"purple", "text":"tomorrow"} ] } } json2 = { "paragraph":{"text":"everyday", "color": "black"} } 

Mit anderen Worten, ich möchte ein Diktat bekommen, das alle Textzeichenfolgen mit einem Schlüssel von "Text" enthält. Für json1 will ich {"json1":"today yesterday tomorrow"} . Für json2 will ich {"json2":"everyday"} .

Jede Hilfe wird sehr geschätzt.

2 Solutions collect form web for “Was ist der effizienteste Weg, um Informationen aus komplexen JSON-Dateien zu extrahieren?”

Wenn Sie nichts anderes wissen, und die Struktur kann ziemlich beliebig sein, wie Sie implizieren, dann müssen Sie jeden Knoten besuchen und überprüfen. Dies kann auf eine generische Weise mit Rekursion erreicht werden. Hier ist eine schnelle und verschmutzte Funktion, um es zu erreichen:

 In [4]: def extract_text(obj, acc): ...: if isinstance(obj, dict): ...: for k, v in obj.items(): ...: if isinstance(v, (dict, list)): ...: extract_text(v, acc) ...: elif k == "text": ...: acc.append(v) ...: elif isinstance(obj, list): ...: for item in obj: ...: extract_text(item, acc) ...: 

Hier ist, wie Sie es verwenden würde:

 In [5]: acc1 = [] In [6]: extract_text(json1, acc1) In [7]: acc1 Out[7]: ['yesterday', 'tomorrow', 'today'] In [8]: acc2 = [] In [9]: extract_text(json2, acc2) In [10]: acc2 Out[10]: ['everyday'] 

Beachten Sie, Ihre Frage hat wirklich nichts mit JSON zu tun, was ein textbasiertes Daten-Serialisierungsformat ist. Sie beschäftigen sich bereits mit demerialisierten Daten und Python-Datenstrukturen. In jedem Fall, wenn Sie wirklich wollen, das Ergebnis haben Sie in Ihrer Frage, können Sie einfach tun:

 In [11]: {"json1": ",".join(acc1)} Out[11]: {'json1': 'yesterday,tomorrow,today'} 

Oder was auch immer Trennzeichen Sie sich gerne anschließen, wie ein einfacher Raum:

 In [12]: {"json1": " ".join(acc1)} Out[12]: {'json1': 'yesterday tomorrow today'} 

Wenn Sie nichts über die Struktur der Json-Dateien wissen, würde ich vorschlagen, den Inhalt zu entleeren und in der Liste zu suchen. Eine schnelle Lösung ist wie folgt. Es geht nur davon aus, dass die 'text' -Taste einem Ein-Wort-Eintrag entspricht.

 import pickle import json # Open .json file f = open("myjson.json") # Load the content info = json.load(f) # Dump the content as a list of words info_list = pickle.dumps(info).split('\n') # Whenever you see a 'text', collect the second next item texts = [info_list[i+2][1:] for i,a in enumerate(info_list) if a.find('text')>0] # Output the result print texts 

Die Ausgabe pro Json-Datei wird:

 In [1]: texts Out[1]: ['yesterday', 'tomorrow', 'today'] 
  • Jquery: post mit json wird eigentlich posten array
  • Py2exe kopiert nicht webdriver_prefs.json in Builds
  • Laden Sie JSON-Dataset in Spark, dann verwenden Sie Filter, Karte, etc
  • Pandas: Hol dir json aus Datenrahmen
  • String to Wörterbuch in Python
  • Refactor eine Liste von JSON-Objekten zu einer verschachtelten Liste
  • Was sind die Unterschiede zwischen json und simplejson Python Module?
  • Github-api gibt 404 bei der Übergabe von json-data mit python + urllib2
  • JSON druckt alle Wege von Wurzel zu Blatt
  • Python zu JSON Serialisierung scheitert an Dezimal
  • Python simpleJSONDecoder und komplexe JSON Ausgabe
  • Python ist die beste Programmiersprache der Welt.