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: 9
Registriert: Dienstag 7. Mai 2019, 10:40

Mittwoch 3. März 2021, 12:22

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: 2745
Registriert: Freitag 17. April 2009, 10:28

Mittwoch 3. März 2021, 12:55

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: 9
Registriert: Dienstag 7. Mai 2019, 10:40

Mittwoch 3. März 2021, 14:22

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: 3436
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Mittwoch 3. März 2021, 14:32

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: 8881
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Mittwoch 3. März 2021, 14:48

@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()
Q: What is the volume of a pizza of radius z and thickness a?
A: pi·z·z·a
einfachTobi
User
Beiträge: 334
Registriert: Mittwoch 13. November 2019, 08:38

Mittwoch 3. März 2021, 14:50

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: 9
Registriert: Dienstag 7. Mai 2019, 10:40

Mittwoch 3. März 2021, 14:58

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: 8881
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Mittwoch 3. März 2021, 16:05

Also mein Beispiel klappt. Nachdem man `glom` installiert hat zumindest.
Q: What is the volume of a pizza of radius z and thickness a?
A: pi·z·z·a
sophe_9
User
Beiträge: 9
Registriert: Dienstag 7. Mai 2019, 10:40

Donnerstag 4. März 2021, 12:28

Danke, hat funktioniert
Antworten