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"])
JSON-Dateien schreiben und lesen
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.
Wenn du die json-Daten schön formatierst, siehst du den Weg. Du musst dich durch die dicts hangeln: cal_obj["Calibration"]["Measurement"] usw.
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
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
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.
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.
- __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
-
- 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.
Also zum Beispiel: cal_obj["Calibration"]["Measurement"]["Values"]["Drift"][0]["Value"]
edit: Ihr seid schnell.
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!
Glom, sagt mir leider nichts und klappt auch leider nicht. Habe es noch nicht verstanden!
- __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