JSON-Dateien schreiben und lesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
sophe_9
User
Beiträge: 34
Registriert: Dienstag 7. Mai 2019, 10:40

Hallo ich habe ein Problem auf gezielte Werte zuzugreifen, mit den einfachen Objekten funktioniert es. Wie z.B Certificate. Aber wie bekomme ich gezielt die Werte von "Type": "Steigung SZ1 ". Über eine Idee würde ich mich sehr freuen.
Hier ist mein Code:

import json
cal_json ="""{
"Calibration": {
"Certificate": "68743",
"Measurement": {
"Values": {
"Temperature": [
23.514,
23.516,
23.516,
23.513,
23.533
],
"Drift": [
{
"Unit": "mbar/s",
"Type": "Steigung SZ1 ",
"Value": [
0.00000183692,
0.00000202171,
0.00000250477,
0.00000282751,
0.00000418883
]
},
{
"Unit": "mbar/s",
"Type": "Steigung SZ2",
"Value": [
0.000808541,
0.000808274,
0.000809318,
0.000810548,
0.000809628
]
}
]
}
}
}
}
"""
cal_obj = json.loads(cal_json)
print(cal_obj["Calibration"]["Certificate"])
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Das json-Modul stellt dir die Daten in Python Datenstrukturen zur Verfügung.
Wenn du die json-Daten schön formatierst, siehst du den Weg. Du musst dich durch die dicts hangeln: cal_obj["Calibration"]["Measurement"] usw.
sophe_9
User
Beiträge: 34
Registriert: Dienstag 7. Mai 2019, 10:40

Danke für die Antwort, aber das funktioniert nicht.

Wenn ich folgenees eingebe:
print(cal_obj["Calibration"]["Measurement"]["Values"]["Drift"])
ist die Antwort:
[{'Unit': 'mbar/s', 'Type': 'Steigung Drift 1', 'Value': [1.83692e-06, 2.02171e-06, 2.50477e-06, 2.82751e-06, 4.18883e-06]}, {'Unit': 'mbar/s', 'Type': 'Steigung SZ', 'Value': [0.000808541, 0.000808274, 0.000809318, 0.000810548, 0.000809628]}]

Aber die nächste Ebene funktioniert nicht:
print(cal_obj["Calibration"]["Measurement"]["Values"]["Drift"][Value])
Antwort:
NameError Traceback (most recent call last)
<ipython-input-48-af74ac6cb3aa> in <module>()
42 """
43 cal_obj = json.loads(cal_json)
---> 44 print(cal_obj["Calibration"]["Measurement"]["Values"]["Drift"][Value])

NameError: name 'Value' is not defined
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

1. Value muss ein String sein, keine Variable.
2. Auch dann funktioniert es noch nicht, da du als nächste Ebene kein Dictionary hast sondern eine Liste von Dictionaries. Du musst also erst das gewünschte Listenelement adressieren.
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@sophe_9: Für so tief in irgendwelchen verschachtelten Strukturen herumwühlen finde ich `glom` ganz praktisch:

Code: Alles auswählen

#!/usr/bin/env python3
import json

from glom import glom, T


CALIBRATION_JSON = """\
{
   "Calibration": {
    "Certificate": "68743",
    "Measurement": {
      "Values": {
        "Temperature": [
          23.514,
          23.516,
          23.516,
          23.513,
          23.533
        ],
        "Drift": [
          {
            "Unit": "mbar/s",
            "Type": "Steigung SZ1 ",
            "Value": [
              0.00000183692,
              0.00000202171,
              0.00000250477,
              0.00000282751,
              0.00000418883
            ]
          },
          {
            "Unit": "mbar/s",
            "Type": "Steigung SZ2",
            "Value": [
              0.000808541,
              0.000808274,
              0.000809318,
              0.000810548,
              0.000809628
            ]
          }
        ]
      }
    }
  }
}
"""


def main():
    calibration_data = json.loads(CALIBRATION_JSON)
    print(glom(calibration_data, "Calibration.Certificate"))
    print(
        glom(
            calibration_data,
            ("Calibration.Measurement.Values.Drift", T[0], "Type"),
        )
    )


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
einfachTobi
User
Beiträge: 491
Registriert: Mittwoch 13. November 2019, 08:38

In Drift steckt ja auch eine Liste mit zwei Werten uuund die Anführungsstriche fehlen ebenfalls.
Also zum Beispiel: cal_obj["Calibration"]["Measurement"]["Values"]["Drift"][0]["Value"]

edit: Ihr seid schnell.
sophe_9
User
Beiträge: 34
Registriert: Dienstag 7. Mai 2019, 10:40

Vielen dank, mit der 0 funkioniert es. Für die schnelle ist es super, aber etwas umständlich, da das File noch komplexer wird und dann nicht mehr eindeutig in der Auswertung. Eine Definition über den Typ wäre da schon besser.
Glom, sagt mir leider nichts und klappt auch leider nicht. Habe es noch nicht verstanden!
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Also mein Beispiel klappt. Nachdem man `glom` installiert hat zumindest.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
sophe_9
User
Beiträge: 34
Registriert: Dienstag 7. Mai 2019, 10:40

Danke, hat funktioniert
Antworten