Wie verwende ich das Modul „json“, um jeweils ein JSON-Objekt einzulesen?

Lesezeit: 5 Minuten

Wie verwende ich das Modul „json um jeweils ein JSON Objekt
Nocken

Ich habe eine Multi-Gigabyte-JSON-Datei. Die Datei besteht aus JSON-Objekten, die jeweils nicht mehr als ein paar tausend Zeichen lang sind, aber es gibt keine Zeilenumbrüche zwischen den Datensätzen.

Mit Python 3 und dem json Modul, wie kann ich jeweils ein JSON-Objekt aus der Datei in den Speicher lesen?

Die Daten befinden sich in einer einfachen Textdatei. Hier ist ein Beispiel für einen ähnlichen Datensatz. Die eigentlichen Datensätze enthalten viele verschachtelte Wörterbücher und Listen.

Aufzeichnung in lesbarem Format:

{
    "results": {
      "__metadata": {
        "type": "DataServiceProviderDemo.Address"
      },
      "Street": "NE 228th",
      "City": "Sammamish",
      "State": "WA",
      "ZipCode": "98074",
      "Country": "USA"
    }
  }
}

Aktuelles Format. Neue Rekorde starten nacheinander ohne Pausen.

{"results": { "__metadata": {"type": "DataServiceProviderDemo.Address"},"Street": "NE 228th","City": "Sammamish","State": "WA","ZipCode": "98074","Country": "USA" } } }{"results": { "__metadata": {"type": "DataServiceProviderDemo.Address"},"Street": "NE 228th","City": "Sammamish","State": "WA","ZipCode": "98074","Country": "USA" } } }{"results": { "__metadata": {"type": "DataServiceProviderDemo.Address"},"Street": "NE 228th","City": "Sammamish","State": "WA","ZipCode": "98074","Country": "USA" } } }

  • Posten Sie ein Beispiel der Daten, zumindest einige Objekte.

    – Bibhas Debnath

    11. Februar 14 um 17:02 Uhr

  • Sie meinen, die JSON-Datei ist ein Array von Objekten, und Sie möchten diese Objekte träge lesen?

    – stupsen

    11. Februar 14 um 17:03 Uhr

  • Und hast du schon nach anderen Beiträgen zu genau diesem Thema gesucht, hier auf Stack Overflow? In der Seitenleiste “zugehörig” ist hier mindestens eine aufgeführt, die ich sehen kann. Inwiefern haben diese Posts Ihre spezielle Situation nicht angesprochen?

    – Martijn Pieters

    11. Februar 14 um 17:11 Uhr

  • @poke Ich bin mir nicht sicher, was du mit “faul” meinst, aber ja, ich denke, das ist es, was ich will.

    – Kamera

    11. Februar 14 um 17:26 Uhr

  • @MartijnPieters Keiner der anderen Beiträge, die ich finden konnte, befasste sich mit demselben Problem. Könnten Sie den Link mit der Lösung teilen, die Sie gefunden haben?

    – Kamera

    11. Februar 14 um 17:29 Uhr

Wie verwende ich das Modul „json um jeweils ein JSON Objekt
Martijn Pieters

Im Allgemeinen wird diese Datei erstellt, wenn mehr als ein JSON-Objekt in eine Datei eingefügt wird ungültiges, defektes JSON. Das heißt, Sie können Daten immer noch in Blöcken analysieren, indem Sie die verwenden JSONDecoder.raw_decode() Methode.

Folgendes ergibt vollständige Objekte, wenn der Parser sie findet:

from json import JSONDecoder
from functools import partial


def json_parse(fileobj, decoder=JSONDecoder(), buffersize=2048):
    buffer=""
    for chunk in iter(partial(fileobj.read, buffersize), ''):
         buffer += chunk
         while buffer:
             try:
                 result, index = decoder.raw_decode(buffer)
                 yield result
                 buffer = buffer[index:].lstrip()
             except ValueError:
                 # Not enough data to decode, read more
                 break

Diese Funktion liest Chunks aus dem angegebenen Dateiobjekt ein buffersize Stücke, und haben die decoder Objekt ganze JSON-Objekte aus dem Puffer parsen. Jedes geparste Objekt wird dem Aufrufer übergeben.

Verwenden Sie es wie folgt:

with open('yourfilename', 'r') as infh:
    for data in json_parse(infh):
        # process object

Verwenden Sie dies nur, wenn Ihre JSON-Objekte hintereinander in eine Datei geschrieben werden, ohne Zeilenumbrüche dazwischen. wenn du tun Zeilenumbrüche haben und jedes JSON-Objekt auf eine einzelne Zeile beschränkt ist, haben Sie eine JSON-Zeilendokument, in diesem Fall können Sie stattdessen Laden und Analysieren einer JSON-Datei mit mehreren JSON-Objekten in Python verwenden.

  • Das hat super funktioniert, danke. Ja, die Datei, mit der ich es zu tun hatte, hatte hintereinander JSON-Objekte. Auch für try/except habe ich ‘pass’ statt ‘break’ verwendet. War die Pause gewollt? Ich konnte es damit nicht zum Laufen bringen.

    – Kamera

    11. Februar 14 um 19:02 Uhr

  • @ user3281420: ja, die break war absichtlich; es bricht die while Schleife, damit wir mit dem nächsten Chunk fortfahren, der aus der Datei gelesen wird. Der break wird nur ausgelöst, wenn im aktuellen Puffer kein JSON-Objekt zum Decodieren vorhanden ist.

    – Martijn Pieters

    11. Februar 14 um 19:04 Uhr


  • @user3281420: pass würde nur funktionieren, wenn der Puffer leer wäre, da dies die andere Beendigungsbedingung für die ist while Schleife.

    – Martijn Pieters

    11. Februar 14 um 19:05 Uhr

  • @RonanDejhero: Es ist einfach genug, a hinzuzufügen .strip() Anruf bei der buffer: result, index = decoder.raw_decode(buffer.strip()) Leerzeichen entfernen, buffer.strip(' n|') um einen expliziten Zeichensatz zu entfernen.

    – Martijn Pieters

    18. Februar 14 um 15:54 Uhr

  • @user2441441: data sind die in ein Python-Objekt dekodierten JSON-Daten. Es hängt davon ab, welches JSON-Objekt Sie dekodiert haben, wie Sie daraus Schlüssel-Wert-Paare erhalten.

    – Martijn Pieters

    09.03.15 um 19:16 Uhr

Wenn Ihre JSON-Dokumente eine Liste von Objekten enthalten und Sie ein Objekt einzeln lesen möchten, können Sie den iterativen JSON-Parser verwenden ijson für die Arbeit. Es liest nur dann mehr Inhalt aus der Datei, wenn es das nächste Objekt dekodieren muss.

Beachten Sie, dass Sie es mit verwenden sollten JAJL Bibliothek, da Sie sonst wahrscheinlich keine Leistungssteigerung feststellen werden.

Abgesehen davon, es sei denn, Ihre Datei ist sehr groß, es komplett in den Speicher zu lesen und dann mit dem normalen JSON-Modul zu parsen, ist wahrscheinlich immer noch die beste Option.

1643220967 598 Wie verwende ich das Modul „json um jeweils ein JSON Objekt
unutbu

Hier ist eine leichte Modifikation der Lösung von Martijn Pieters, die mit Leerzeichen getrennte JSON-Strings verarbeitet.

def json_parse(fileobj, decoder=json.JSONDecoder(), buffersize=2048, 
               delimiters=None):
    remainder=""
    for chunk in iter(functools.partial(fileobj.read, buffersize), ''):
        remainder += chunk
        while remainder:
            try:
                stripped = remainder.strip(delimiters)
                result, index = decoder.raw_decode(stripped)
                yield result
                remainder = stripped[index:]
            except ValueError:
                # Not enough data to decode, read more
                break

Zum Beispiel, wenn data.txt enthält durch ein Leerzeichen getrennte JSON-Strings:

{"business_id": "1", "Accepts Credit Cards": true, "Price Range": 1, "type": "food"} {"business_id": "2", "Accepts Credit Cards": true, "Price Range": 2, "type": "cloth"} {"business_id": "3", "Accepts Credit Cards": false, "Price Range": 3, "type": "sports"}

dann

In [47]: list(json_parse(open('data')))
Out[47]: 
[{u'Accepts Credit Cards': True,
  u'Price Range': 1,
  u'business_id': u'1',
  u'type': u'food'},
 {u'Accepts Credit Cards': True,
  u'Price Range': 2,
  u'business_id': u'2',
  u'type': u'cloth'},
 {u'Accepts Credit Cards': False,
  u'Price Range': 3,
  u'business_id': u'3',
  u'type': u'sports'}]

.

649630cookie-checkWie verwende ich das Modul „json“, um jeweils ein JSON-Objekt einzulesen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy