Script verbessern

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
dll-live
User
Beiträge: 35
Registriert: Dienstag 11. August 2020, 09:25
Wohnort: CH

Hallo zusammen.

Das folgende Script erfüllt seinen Zweck, macht was es soll. Doch bin ich mir sicher - das es noch einiges an Verbesserungspotential gibt. Mag sich jemand die Zeit nehmen und die Mühe machen - mich an die Hand zu nehmen und mir zeigen, was ich wo verbessern kann (evtl noch erklären warum?) - Besten Dank.

Code: Alles auswählen

#!/usr/bin/python3
# Imports
import json


def f_rekursiv_wb(wb):
    for k in wb.keys():
        v = wb[k]
        if isinstance(v, dict):
            f_rekursiv_wb(v)
        else:
            temp_wb[k] = v


def f_schuessel_suchen(schluessel, wb):
    if schluessel in wb:
        return wb[schluessel]
    else:
        return ""


def f_check_neuer_wert(wb_wert, neuer_Wert):
    if wb_wert == "":
        return neuer_Wert
    else:
        return wb_wert


def f_list_4_string(liste):
    var_1 = liste[0]
    var_2 = liste[1]
    var_3 = liste[2]
    var_4 = liste[3]
    return var_1, var_2, var_3, var_4


with open('Deconz_Sensoren.txt', 'r') as datei:
    json_wb = json.load(datei)
temp_wb = {}
neues_wb = {}

for k in json_wb.keys():
    f_rekursiv_wb(json_wb[k])
    name = f_schuessel_suchen("name", temp_wb)
    batterie = f_schuessel_suchen("battery", temp_wb)
    temperatur = f_schuessel_suchen("temperature", temp_wb)
    sonnenaufgang = f_schuessel_suchen("sunrise", temp_wb)
    sonnenuntergang = f_schuessel_suchen("sunset", temp_wb)
    if isinstance(temperatur, int):
        temperatur = temperatur / 100
    if name not in neues_wb.keys():
        neues_wb[name] = "{}**{}**{}**{}".format(batterie, temperatur, sonnenaufgang, sonnenuntergang)
    else:
        temp_batterie, temp_temperatur, temp_sonnenaufgang, temp_sonnenuntergang = \
            f_list_4_string(neues_wb[name].split("**"))
        batterie = f_check_neuer_wert(temp_batterie, batterie)
        temperatur = f_check_neuer_wert(temp_temperatur, temperatur)
        sonnenaufgang = f_check_neuer_wert(temp_sonnenaufgang, sonnenaufgang)
        sonnenuntergang = f_check_neuer_wert(temp_sonnenuntergang, sonnenuntergang)
        neues_wb[name] = "{}**{}**{}**{}".format(batterie, temperatur, sonnenaufgang, sonnenuntergang)
    temp_wb = {}

for k, v in list(neues_wb.items()):
    if len(v) == 6:
        del neues_wb[k]

with open ("Sensoren.txt", "w") as datei:
    for k in neues_wb.keys():
        datei.write("Schlüssel: {}, Werte: {}\n".format(k, neues_wb[k]))

print("Benötigte Werte in neue Datei geschrieben - Fertig!")
Die Datei "Deconz_Sensoren.txt" ist als "gegeben" zu betrachten und kann von mir NICHT verändert werden!
Die Struktur der Datei "Sensoren.txt" ist ebenfalls als "gegeben" zu betrachten.

Da ich die Dateien als solches nicht hochladen kann (wahrscheinlich blind bin :) - füge ich sie halt als Text (im Codeblock) ein.

Inhalt der Datei "Deconz_Sensoren.txt":

Code: Alles auswählen

{
  "1": {
    "config": {
      "configured": true,
      "on": true,
      "sunriseoffset": 30,
      "sunsetoffset": -30
    },
    "etag": "e785e2698f497370c7c26899dcc4ea5d",
    "manufacturername": "Philips",
    "modelid": "PHDL00",
    "name": "Sensor_1",
    "state": {
      "dark": true,
      "daylight": false,
      "lastupdated": "2022-03-02T18:50:44.399",
      "status": 230,
      "sunrise": "2022-03-02T06:02:19",
      "sunset": "2022-03-02T17:09:01"
    },
    "swversion": "1.0",
    "type": "Daylight",
    "uniqueid": "00:21:2e:ff:ff:06:ba:a8-01"
  },
  "11": {
    "config": {
      "alert": "none",
      "battery": 100,
      "delay": 62,
      "ledindication": false,
      "on": true,
      "pending": [],
      "reachable": true,
      "sensitivity": 2,
      "sensitivitymax": 2,
      "usertest": false
    },
    "ep": 2,
    "etag": "4984f3d3835e854ca65196fe6c699dbe",
    "lastannounced": "2022-02-27T19:29:09Z",
    "lastseen": "2022-03-02T19:17Z",
    "manufacturername": "Philips",
    "modelid": "SML001",
    "name": "Bewegung_1",
    "state": {
      "lastupdated": "2022-03-02T19:17:04.904",
      "presence": false
    },
    "swversion": "6.1.0.18912",
    "type": "ZHAPresence",
    "uniqueid": "00:17:88:01:09:15:87:47-02-0406"
  },
  "12": {
    "config": {
      "alert": "none",
      "battery": 100,
      "ledindication": false,
      "offset": 0,
      "on": true,
      "pending": [],
      "reachable": true,
      "usertest": false
    },
    "ep": 2,
    "etag": "f9d61e8f4a9a1093a846e451fd803a5d",
    "lastannounced": "2022-02-27T19:29:09Z",
    "lastseen": "2022-03-02T19:17Z",
    "manufacturername": "Philips",
    "modelid": "SML001",
    "name": "Bewegung_1",
    "state": {
      "lastupdated": "2022-03-02T19:15:58.262",
      "temperature": 1577
    },
    "swversion": "6.1.0.18912",
    "type": "ZHATemperature",
    "uniqueid": "00:17:88:01:09:15:87:47-02-0402"
  },
  "13": {
    "config": {
      "alert": "none",
      "battery": 100,
      "ledindication": false,
      "on": true,
      "pending": [],
      "reachable": true,
      "tholddark": 12000,
      "tholdoffset": 7000,
      "usertest": false
    },
    "ep": 2,
    "etag": "b3c2345b301003fd40ab135145b70371",
    "lastannounced": "2022-02-27T19:29:09Z",
    "lastseen": "2022-03-02T19:17Z",
    "manufacturername": "Philips",
    "modelid": "SML001",
    "name": "Bewegung_1",
    "state": {
      "dark": true,
      "daylight": false,
      "lastupdated": "2022-03-02T19:17:04.919",
      "lightlevel": 0,
      "lux": 0
    },
    "swversion": "6.1.0.18912",
    "type": "ZHALightLevel",
    "uniqueid": "00:17:88:01:09:15:87:47-02-0400"
  },
  "15": {
    "config": {
      "battery": 98,
      "group": "10",
      "on": true,
      "reachable": true
    },
    "ep": 1,
    "etag": "981eb84b62cd13d3e523ffc29512cfff",
    "lastannounced": "2022-02-01T09:11:53Z",
    "lastseen": "2022-03-02T19:15Z",
    "manufacturername": "Signify Netherlands B.V.",
    "mode": 1,
    "modelid": "RWL022",
    "name": "Schalter_1",
    "state": {
      "buttonevent": 1002,
      "eventduration": 1,
      "lastupdated": "2022-03-01T06:22:20.055"
    },
    "swversion": "2.42.0_h1F5E860",
    "type": "ZHASwitch",
    "uniqueid": "00:17:88:01:09:26:9a:5d-01-fc00"
  },
  "16": {
    "config": {
      "battery": 95,
      "group": "11",
      "on": true,
      "reachable": true
    },
    "ep": 1,
    "etag": "f0b85611c64d5803b6f5a8b90f256342",
    "lastannounced": "2022-01-30T21:23:12Z",
    "lastseen": "2022-03-02T19:18Z",
    "manufacturername": "Signify Netherlands B.V.",
    "mode": 1,
    "modelid": "RWL022",
    "name": "Schalter_2",
    "state": {
      "buttonevent": 1002,
      "eventduration": 0,
      "lastupdated": "2022-02-27T22:45:13.063"
    },
    "swversion": "2.42.0_h1F5E860",
    "type": "ZHASwitch",
    "uniqueid": "00:17:88:01:09:26:a7:c9-01-fc00"
  },
  "17": {
    "config": {
      "battery": 100,
      "devicemode": "singlerocker",
      "on": true,
      "pending": [],
      "reachable": true
    },
    "ep": 1,
    "etag": "a7de2ea63fbcf9097e65222b2d866041",
    "lastannounced": "2022-01-31T20:19:53Z",
    "lastseen": "2022-03-02T19:05Z",
    "manufacturername": "Signify Netherlands B.V.",
    "mode": 1,
    "modelid": "RDM001",
    "name": "Schalter_3",
    "state": {
      "buttonevent": 1002,
      "eventduration": 1,
      "lastupdated": "2022-02-27T18:10:39.328"
    },
    "swversion": "1.0.3",
    "type": "ZHASwitch",
    "uniqueid": "00:17:88:01:0b:01:4e:d9-01-fc00"
  },
  "18": {
    "config": {
      "battery": 100,
      "devicemode": "singlerocker",
      "on": true,
      "pending": [],
      "reachable": true
    },
    "ep": 1,
    "etag": "6076f834e01f7d7b0b11db0b077d2815",
    "lastannounced": "2022-01-22T19:59:29Z",
    "lastseen": "2022-03-02T19:13Z",
    "manufacturername": "Signify Netherlands B.V.",
    "mode": 1,
    "modelid": "RDM001",
    "name": "Schalter_4",
    "state": {
      "buttonevent": 1002,
      "eventduration": 1,
      "lastupdated": "2022-03-01T21:38:01.043"
    },
    "swversion": "1.0.3",
    "type": "ZHASwitch",
    "uniqueid": "00:17:88:01:0b:01:4f:bf-01-fc00"
  },
  "19": {
    "config": {
      "battery": 100,
      "devicemode": "singlepushbutton",
      "on": true,
      "pending": [],
      "reachable": true
    },
    "ep": 1,
    "etag": "cd461de2f815a89a95568c33166eb798",
    "lastannounced": null,
    "lastseen": "2022-03-02T19:12Z",
    "manufacturername": "Signify Netherlands B.V.",
    "mode": 1,
    "modelid": "RDM001",
    "name": "Schalter_5",
    "state": {
      "buttonevent": 1002,
      "eventduration": 2,
      "lastupdated": "2022-02-28T23:40:37.167"
    },
    "swversion": "1.0.3",
    "type": "ZHASwitch",
    "uniqueid": "00:17:88:01:0b:00:fe:0a-01-fc00"
  },
  "2": {
    "config": {
      "battery": 100,
      "group": "3",
      "on": true,
      "reachable": true
    },
    "ep": 1,
    "etag": "11c4de321368a2cec4362c5845196bd4",
    "lastannounced": "2022-02-16T10:46:27Z",
    "lastseen": "2022-03-02T19:15Z",
    "manufacturername": "Signify Netherlands B.V.",
    "mode": 1,
    "modelid": "RWL022",
    "name": "Schalter_6",
    "state": {
      "buttonevent": 4002,
      "eventduration": 1,
      "lastupdated": "2022-03-01T19:49:29.893"
    },
    "swversion": "2.42.0_h1F5E860",
    "type": "ZHASwitch",
    "uniqueid": "00:17:88:01:09:26:89:c2-01-fc00"
  },
  "20": {
    "config": {
      "battery": 100,
      "devicemode": "singlerocker",
      "on": true,
      "pending": [],
      "reachable": true
    },
    "ep": 1,
    "etag": "8852c006b96d881fbd892033da9d4208",
    "lastannounced": "2022-02-12T08:49:26Z",
    "lastseen": "2022-03-02T19:14Z",
    "manufacturername": "Signify Netherlands B.V.",
    "mode": 1,
    "modelid": "RDM001",
    "name": "Schalter_7",
    "state": {
      "buttonevent": 1002,
      "eventduration": 1,
      "lastupdated": "2022-03-01T21:46:33.888"
    },
    "swversion": "1.0.3",
    "type": "ZHASwitch",
    "uniqueid": "00:17:88:01:0b:01:4f:bd-01-fc00"
  },
  "21": {
    "config": {
      "battery": 100,
      "devicemode": "singlerocker",
      "on": true,
      "pending": [],
      "reachable": true
    },
    "ep": 1,
    "etag": "e5a01c07df11b2c9d4dd6a7d30892d58",
    "lastannounced": "2022-02-25T18:04:56Z",
    "lastseen": "2022-03-02T19:15Z",
    "manufacturername": "Signify Netherlands B.V.",
    "mode": 1,
    "modelid": "RDM001",
    "name": "Schalter_8",
    "state": {
      "buttonevent": 1002,
      "eventduration": 1,
      "lastupdated": "2022-03-01T21:40:19.243"
    },
    "swversion": "1.0.3",
    "type": "ZHASwitch",
    "uniqueid": "00:17:88:01:0b:01:49:de-01-fc00"
  },
  "22": {
    "config": {
      "on": true,
      "reachable": true
    },
    "etag": "0edff74330cf0bdea3a574329c7449c1",
    "manufacturername": "Hue Essentials",
    "modelid": "Motion sensor 6 state",
    "name": "Sensor_2",
    "state": {
      "lastupdated": "2022-03-02T11:46:28.403",
      "status": 0
    },
    "swversion": "1.0",
    "type": "CLIPGenericStatus",
    "uniqueid": "lSQz45ucRBeyA7PwpPshdJsT5z5eR8jL"
  },
  "24": {
    "config": {
      "group": "20001",
      "on": true,
      "reachable": true
    },
    "ep": 2,
    "etag": "7f539fa4aa8abc8bec6e8820c3e3e0e3",
    "lastannounced": null,
    "lastseen": "2022-03-02T19:13Z",
    "manufacturername": "dresden elektronik",
    "mode": 1,
    "modelid": "Kobold",
    "name": "Schalter_9",
    "state": {
      "buttonevent": 1002,
      "lastupdated": "2022-03-02T19:13:40.862"
    },
    "swversion": "0103.10000026",
    "type": "ZHASwitch",
    "uniqueid": "00:21:2e:ff:ff:0a:64:b4-02-0006"
  },
  "27": {
    "config": {
      "group": "20003",
      "on": true,
      "reachable": true
    },
    "ep": 2,
    "etag": "3c37286745969a452fa99427a5086a86",
    "lastannounced": null,
    "lastseen": "2022-03-01T21:52Z",
    "manufacturername": "dresden elektronik",
    "mode": 1,
    "modelid": "Kobold",
    "name": "Schalter_10",
    "state": {
      "buttonevent": 1002,
      "lastupdated": "2022-03-01T21:52:58.451"
    },
    "swversion": "0103.10000026",
    "type": "ZHASwitch",
    "uniqueid": "00:21:2e:ff:ff:0a:64:bc-02-0006"
  },
  "28": {
    "config": {
      "duration": 60,
      "on": true,
      "reachable": true
    },
    "etag": "0fe3102b4998b4ca54bb41a019ef7609",
    "manufacturername": "Phoscon",
    "modelid": "PHOSCON_VPIR",
    "name": "Sensor_3",
    "state": {
      "lastupdated": "2022-03-02T11:30:23.199",
      "presence": false
    },
    "swversion": "1.0",
    "type": "CLIPPresence",
    "uniqueid": "vpir-1645724778030"
  },
  "29": {
    "config": {
      "on": true,
      "reachable": true
    },
    "etag": "53338d88f932740a4b36264b0c1977f8",
    "manufacturername": "Phoscon",
    "modelid": "PHOSCON_FSM_STATE",
    "name": "Sensor_4",
    "state": {
      "lastupdated": "2022-03-01T21:47:56.401",
      "status": 0
    },
    "swversion": "1.0",
    "type": "CLIPGenericStatus",
    "uniqueid": "fsm-state-1645724778030"
  },
  "3": {
    "config": {
      "alert": "none",
      "battery": 100,
      "delay": 122,
      "ledindication": false,
      "on": true,
      "pending": [],
      "reachable": true,
      "sensitivity": 2,
      "sensitivitymax": 2,
      "usertest": false
    },
    "ep": 2,
    "etag": "0bce2ef074c0d840c8433060b5afe6e2",
    "lastannounced": "2022-03-02T14:56:15Z",
    "lastseen": "2022-03-02T19:18Z",
    "manufacturername": "Philips",
    "modelid": "SML001",
    "name": "Bewegung_2",
    "state": {
      "lastupdated": "2022-03-02T19:15:45.044",
      "presence": false
    },
    "swversion": "6.1.0.18912",
    "type": "ZHAPresence",
    "uniqueid": "00:17:88:01:09:15:7d:cf-02-0406"
  },
  "30": {
    "config": {
      "duration": 60,
      "on": true,
      "reachable": true
    },
    "etag": "2fbc9f27ac8994effc33745a095a9f98",
    "manufacturername": "Phoscon",
    "modelid": "PHOSCON_VPIR",
    "name": "Sensor_5",
    "state": {
      "lastupdated": "2022-03-01T21:38:05.402",
      "presence": false
    },
    "swversion": "1.0",
    "type": "CLIPPresence",
    "uniqueid": "vpir-1645752215866"
  },
  "31": {
    "config": {
      "on": true,
      "reachable": true
    },
    "etag": "53d573c9b80bffba517f4be819f8fbca",
    "manufacturername": "Phoscon",
    "modelid": "PHOSCON_FSM_STATE",
    "name": "Sensor_6",
    "state": {
      "lastupdated": "2022-03-01T21:38:15.401",
      "status": 0
    },
    "swversion": "1.0",
    "type": "CLIPGenericStatus",
    "uniqueid": "fsm-state-1645752215866"
  },
  "4": {
    "config": {
      "alert": "none",
      "battery": 100,
      "ledindication": false,
      "offset": 0,
      "on": true,
      "pending": [],
      "reachable": true,
      "usertest": false
    },
    "ep": 2,
    "etag": "3cdd33630dec275d3c889308d8859d51",
    "lastannounced": "2022-03-02T14:56:15Z",
    "lastseen": "2022-03-02T19:18Z",
    "manufacturername": "Philips",
    "modelid": "SML001",
    "name": "Bewegung_2",
    "state": {
      "lastupdated": "2022-03-02T19:18:04.390",
      "temperature": 1632
    },
    "swversion": "6.1.0.18912",
    "type": "ZHATemperature",
    "uniqueid": "00:17:88:01:09:15:7d:cf-02-0402"
  },
  "5": {
    "config": {
      "alert": "none",
      "battery": 100,
      "ledindication": false,
      "on": true,
      "pending": [],
      "reachable": true,
      "tholddark": 12000,
      "tholdoffset": 7000,
      "usertest": false
    },
    "ep": 2,
    "etag": "3cdd33630dec275d3c889308d8859d51",
    "lastannounced": "2022-03-02T14:56:15Z",
    "lastseen": "2022-03-02T19:18Z",
    "manufacturername": "Philips",
    "modelid": "SML001",
    "name": "Bewegung_2",
    "state": {
      "dark": true,
      "daylight": false,
      "lastupdated": "2022-03-02T19:15:45.088",
      "lightlevel": 11662,
      "lux": 15
    },
    "swversion": "6.1.0.18912",
    "type": "ZHALightLevel",
    "uniqueid": "00:17:88:01:09:15:7d:cf-02-0400"
  },
  "6": {
    "config": {
      "alert": "none",
      "battery": 100,
      "delay": 122,
      "ledindication": false,
      "on": true,
      "pending": [],
      "reachable": true,
      "sensitivity": 2,
      "sensitivitymax": 2,
      "usertest": false
    },
    "ep": 2,
    "etag": "7cb3a798284e15254325148e6944fb61",
    "lastannounced": "2022-03-01T03:13:22Z",
    "lastseen": "2022-03-02T19:15Z",
    "manufacturername": "Philips",
    "modelid": "SML001",
    "name": "Bewegung_3",
    "state": {
      "lastupdated": "2022-03-02T19:15:58.222",
      "presence": false
    },
    "swversion": "6.1.0.18912",
    "type": "ZHAPresence",
    "uniqueid": "00:17:88:01:09:15:7d:f7-02-0406"
  },
  "7": {
    "config": {
      "alert": "none",
      "battery": 100,
      "ledindication": false,
      "offset": 0,
      "on": true,
      "pending": [],
      "reachable": true,
      "usertest": false
    },
    "ep": 2,
    "etag": "3ea882dd62b9acb7e4a2af1338abffa7",
    "lastannounced": "2022-03-01T03:13:22Z",
    "lastseen": "2022-03-02T19:15Z",
    "manufacturername": "Philips",
    "modelid": "SML001",
    "name": "Bewegung_3",
    "state": {
      "lastupdated": "2022-03-02T19:15:23.605",
      "temperature": 1504
    },
    "swversion": "6.1.0.18912",
    "type": "ZHATemperature",
    "uniqueid": "00:17:88:01:09:15:7d:f7-02-0402"
  },
  "8": {
    "config": {
      "alert": "none",
      "battery": 100,
      "ledindication": false,
      "on": true,
      "pending": [],
      "reachable": true,
      "tholddark": 12000,
      "tholdoffset": 7000,
      "usertest": false
    },
    "ep": 2,
    "etag": "430d41efeb735728283928f1deeb0258",
    "lastannounced": "2022-03-01T03:13:22Z",
    "lastseen": "2022-03-02T19:15Z",
    "manufacturername": "Philips",
    "modelid": "SML001",
    "name": "Bewegung_3",
    "state": {
      "dark": true,
      "daylight": false,
      "lastupdated": "2022-03-02T19:15:58.280",
      "lightlevel": 4403,
      "lux": 3
    },
    "swversion": "6.1.0.18912",
    "type": "ZHALightLevel",
    "uniqueid": "00:17:88:01:09:15:7d:f7-02-0400"
  }
}
Inhalt der Datei "Sensoren.txt":

Code: Alles auswählen

Schlüssel: Sensor_1, Werte: ****2022-03-02T06:02:19**2022-03-02T17:09:01
Schlüssel: Bewegung_1, Werte: 100**15.77****
Schlüssel: Schalter_1, Werte: 98******
Schlüssel: Schalter_2, Werte: 95******
Schlüssel: Schalter_3, Werte: 100******
Schlüssel: Schalter_4, Werte: 100******
Schlüssel: Schalter_5, Werte: 100******
Schlüssel: Schalter_6, Werte: 100******
Schlüssel: Schalter_7, Werte: 100******
Schlüssel: Schalter_8, Werte: 100******
Schlüssel: Bewegung_2, Werte: 100**16.32****
Schlüssel: Bewegung_3, Werte: 100**15.04****
Freundliche Grüsse
Daniel
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

Dein Funktions- und Variablennamen sind alle furchtbar schlecht.
Was sollen diese ganzen f_-Präfixe?
`temp_wb` ist eine globale Variable. Sowas darf es nicht geben.
Und benutze keine Abkürzungen, wenn Du temperatur meinst, dann schreib das auch, obwohl, was soll temperatur_sonnenaufgang denn bedeuten?
Dass ein Wörterbuch aus einer json-Datei stammt, ist doch unerheblich, was ist der Inhalt?

`f_schuessel_suchen` macht fast nichts anderes als dict.get.
`f_list_4_string` ist ein furchtbar komplizierter Weg um eine Liste in ein Tuple umzuwandeln.
Wenn man sowohl den Schlüssel als auch den Wert braucht, nimmt man dict.items.
Man intialisiert Werte am Anfang der Schleife und nicht am Ende. Das ist doch völlig undurchsichtig.

Daten formatiert man erst für die Ausgabe, und nicht zwischendrin. So mußt Du ständig Daten formatieren und diese Formatierung wieder rückgängig machen! Und was passiert, wenn in einem der Werte ** vorkommt?
Wenn man das alles in den passenden Datenstrukturen läßt, reduziert sich der vierfach kopierte Code enorm.

Man löscht keine Werte aus einer Datenstruktur, sondern erzeugt einfach eine beue, dann muß man auch nicht vorher allen Inhalt kopieren.

Statt die Datenstruktur flach zu klopfen, nutze sie, so wie sie ist.

Code: Alles auswählen

import json

KEYS = [
    ("config", "battery"),
    ("state", "temperature"),
    ("state", "sunrise"),
    ("state", "sunset")
]

def format_sensor(sensor):
    return "**".join(
        str(sensor.get(key, ""))
        for key in KEYS)

def main():
    with open('Deconz_Sensoren.txt', encoding="utf8") as file:
        data = json.load(file)

    sensors = {}
    for entry in data.values():
        name = entry.get("name", "")
        sensor = sensors.get(name, {})
        for key, subkey in KEYS:
            if key in entry and entry.get(subkey):
                sensor[key] = entry[key][subkey]
                if subkey == "temperature":
                    sensor[key] /= 100
        sensors[name] = sensor

    sensors = {name: sensor for name, sensor in sensors if sensor}
    with open("Sensoren.txt", "w", encoding="utf8") as file:
        for name, sensor in sensors.items():
            file.write("Schlüssel: {}, Werte: {}\n".format(name, format_sensor(sensor)))

    print("Benötigte Werte in neue Datei geschrieben - Fertig!")


if __name__ == "__main__":
    main()
dll-live
User
Beiträge: 35
Registriert: Dienstag 11. August 2020, 09:25
Wohnort: CH

@Sirius3


Wieso sind meine Variablen/Funktionsnamen furchtbar schlecht?
Besten Dank für deine Antwort. Anbei noch ein paar Erklärungen zu meinem Code....

Bei den Funktionen habe ich (damit ich es besser auseinanderhalten kann immer ein f_ beim Funktionsname gemacht.
"Zählervariablen" habe ich immer nur "einbuchstabig" gemacht.
temp_sonnenaufgang da steht das temp für temporär....

Leider ist dein Code so nicht lauffähig.
Dazu noch Frage was macht die Zeile

Code: Alles auswählen

sensor = sensors.get(name, {})
Da holst du doch Daten raus, obwohl nirgens Daten in dictonarynamens sensors geschrieben werden.?

Dann für mich fast das interessanteste - woher hast du dieses Wissen?

Gruss Daniel
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

Gibt es irgendeine Funktion in der Standardbibliothek, die mit f_ anfängt? Nein?
Weil man schon allein am Namen erkennen kann, was eine Funktion ist, und was nicht. Wenn ein Name eine Tätigkeit beschreibt, dann ist das ein starker Hinweis darauf, dass das eine Funktion ist.

Variablennamen sollten immer beschreiben, für was die Variable gebraucht wird.
Niemand kann an einem wb erkennen, für was das da sein soll.
Wann ist eine Variable temporär? Und ist das in diesem Zusammenhang wichtig?

Was dict.get macht, kannst Du einfach in der Dokumentation nachlesen. Hier wird geschaut, ob es schon einen Eintrag im Wörterbuch gibt, und falls nicht, wird ein leeres Wörterbuch zurückgegeben, um dann die Daten eines Sensors entweder zu erstellen oder zu erhänzen.
Ich hätte auch dict.setdefault benutzen können, das ist aber noch unbekannter.

Der Fehler war, dass ich nachträglich noch den `subkey` einfügen mußte.

Code: Alles auswählen

    sensors = {}
    for entry in data.values():
        name = entry["name"]
        sensor = sensors.setdefault(name, {})
        for key, subkey in KEYS:
            if key in entry and entry[key].get(subkey):
                sensor[key, subkey] = entry[key][subkey]
                if subkey == "temperature":
                    sensor[key, subkey] /= 100
Das Wissen kommt daher, dass man viel Code liest und selbst schreibt.
dll-live
User
Beiträge: 35
Registriert: Dienstag 11. August 2020, 09:25
Wohnort: CH

@Sirius3

Besten Dank für deine Ausführungen.
Deine Argumente mit den Namen für Funktionen und Variablen sind mir verständlich. Werde dies in Zukunft so umsetzen.
Ja, was Dict.get macht - kann ich nachlesen - weiss auch nicht, was ich da nicht verstanden hatte.
dict.setdefaults habe ich nachgeschaut und auch verstanden (wie auch bei nochmaligem lesen dict.get).

Wenn ich den Code, nun ausführe, bekomme ich einen Laufzeitfehler.

Code: Alles auswählen

Bewegung_3
{('config', 'battery'): 100, ('state', 'temperature'): 15.04}
Traceback (most recent call last):
  File "/home/p13_dani/Desktop/Python_Programme/Deconz_INET_Loesung.py", line 42, in <module>
    main()
  File "/home/p13_dani/Desktop/Python_Programme/Deconz_INET_Loesung.py", line 33, in main
    sensors = {name: sensor for name, sensor in sensors if sensor}
  File "/home/p13_dani/Desktop/Python_Programme/Deconz_INET_Loesung.py", line 33, in <dictcomp>
    sensors = {name: sensor for name, sensor in sensors if sensor}
ValueError: too many values to unpack (expected 2)[

Process finished with exit code 1
Die Zeile welche den Fehler wirft, macht Dict-comprehension.Leider blicke ich da noch nicht durch (genau so wie list-comprehension) - Vielleicht kannst du mir das ja (Dau 8) :wink: mässig erklären) oder auf eine gute "Hilfeseite" verweisen.

Freundliche Grüsse
Daniel
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

Eine dict-Comprehension ist wie eine for-Schleife, die Schlüssel in einem Wörterbuch setzt.
Hier fehlt `items`, weil wir ja sowohl Schlüssel als auch Wert brauchen:

Code: Alles auswählen

sensors = {name: sensor for name, sensor in sensors.items() if sensor}
Antworten