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: 14195
- 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()“Every thinking person fears nuclear war and every technological nation plans for it. Everyone knows
it's madness, and every country has an excuse.” — Carl Sagan, Cosmos, Episode 13: Who Speaks for Earth?
it's madness, and every country has an excuse.” — Carl Sagan, Cosmos, Episode 13: Who Speaks for Earth?
-
einfachTobi
- User
- Beiträge: 512
- 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: 14195
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Also mein Beispiel klappt. Nachdem man `glom` installiert hat zumindest.
“Every thinking person fears nuclear war and every technological nation plans for it. Everyone knows
it's madness, and every country has an excuse.” — Carl Sagan, Cosmos, Episode 13: Who Speaks for Earth?
it's madness, and every country has an excuse.” — Carl Sagan, Cosmos, Episode 13: Who Speaks for Earth?
