Python split string

  • Hallo,

    ich möchte aus dem folgen String:

    b'[{"circuit": "11", "debounce": 0, "value": 0, "dev": "input", "counter_mode": false, "time": 0}, {"circuit": "10", "debounce": 0, "value": 0, "dev": "input", "counter_mode": false, "time": 0}, {"circuit": "12", "debounce": 0, "value": 0, "dev": "input", "counter_mode": false, "time": 0}, {"circuit": "1", "debounce": 0, "value": 0, "dev": "input", "counter_mode": false, "time": 3632022990}, {"circuit": "3", "debounce": 0, "value": 0, "dev": "input", "counter_mode": false, "time": 0}, {"circuit": "2", "debounce": 0, "value": 0, "dev": "input", "counter_mode": false, "time": 0}, {"circuit": "5", "debounce": 0, "value": 0, "dev": "input", "counter_mode": false, "time": 0}, {"circuit": "4", "debounce": 0, "value": 0, "dev": "input", "counter_mode": false, "time": 0}, {"circuit": "7", "debounce": 0, "value": 0, "dev": "input", "counter_mode": false, "time": 0}, {"circuit": "6", "debounce": 0, "value": 0, "dev": "input", "counter_mode": false, "time": 0}, {"circuit": "9", "debounce": 0, "value": 0, "dev": "input", "counter_mode": false, "time": 0}, {"circuit": "8", "debounce": 0, "value": 0, "dev": "input", "counter_mode": false, "time": 0}, {"value": 0, "pending": false, "circuit": "1", "dev": "relay"}, {"value": 0, "pending": false, "circuit": "3", "dev": "relay"}, {"value": 0, "pending": false, "circuit": "2", "dev": "relay"}, {"value": 0, "pending": false, "circuit": "5", "dev": "relay"}, {"value": 0, "pending": false, "circuit": "4", "dev": "relay"}, {"value": 0, "pending": false, "circuit": "7", "dev": "relay"}, {"value": 0, "pending": false, "circuit": "6", "dev": "relay"}, {"value": 0, "pending": false, "circuit": "8", "dev": "relay"}, {"interval": 2.0, "value": 0.0007828726445256769, "dev": "ai", "circuit": "1", "time": null, "bits": 18, "gain": 1}, {"interval": 1.0, "value": 0.0009563011322346285, "dev": "ai", "circuit": "2", "time": null, "bits": 18, "gain": 1}, {"value": 0, "frequency": 100, "circuit": "1", "dev": "ao"}, {"interval": 15, "value": 19.7, "circuit": "281893C00700005E", "address": "281893C00700005E", "time": 1480168545.079056, "typ": "DS18B20", "lost": false, "dev": "temp"}, {"interval": 15, "value": 13.95, "circuit": "282836C1070000DD", "address": "282836C1070000DD", "time": 1480168558.622758, "typ": "DS18B20", "lost": false, "dev": "temp"}, {"interval": 15, "value": 19.2, "circuit": "28B01DC107000045", "address": "28B01DC107000045", "time": 1480168557.206936, "typ": "DS18B20", "lost": false, "dev": "temp"}, {"interval": 15, "value": 19.95, "circuit": "2892844D07000012", "address": "2892844D07000012", "time": 1480168546.526963, "typ": "DS18B20", "lost": false, "dev": "temp"}]'

    eine Python Liste machen die als Elemente jeweils den Bereich zwischen { und } inklusive der geschweiften Klammern enthält. Wer kann mir helfen das möglichst effizient umzusetzen?

  • Vorher bearbeitest du bitte deinen Beitrag und umschließt deinen "String" entsprechend: FAQ => Nützliche Links / Linksammlung => HowTo: CODE / PHP Code im Forum posten

    Dann wäre ein Hinweiß gut ob du Python3 oder Python2 nutzen willst - da dein "String" offensichtlich python3 ist.

    Und zu guter letzt wäre es schön wenn du erwähnst woher das stammt - wie du das ausgelesen hast oder allgemein was dir das erzeugt hat... Sieht verdächtig nach JSON aus, wenn dem so ist könnte man entsprechend besser damit umgehen. Es könnte aber auch ein DICT mit LIST sein ...

    Mich irritiert gerade aber auch was das b am Anfang soll... Wieso wird es als byte deklariert?

    Naja, vielleicht kannst du damit ja was anfangen:
    [code=php]
    import json

    source = b'[{"circuit": "11", "debounce": 0, "value": 0, "dev": "input", "counter_mode": false, "time": 0}, {"circuit": "10", "debounce": 0, "value": 0, "dev": "input", "counter_mode": false, "time": 0}, {"circuit": "12", "debounce": 0, "value": 0, "dev": "input", "counter_mode": false, "time": 0}, {"circuit": "1", "debounce": 0, "value": 0, "dev": "input", "counter_mode": false, "time": 3632022990}, {"circuit": "3", "debounce": 0, "value": 0, "dev": "input", "counter_mode": false, "time": 0}, {"circuit": "2", "debounce": 0, "value": 0, "dev": "input", "counter_mode": false, "time": 0}, {"circuit": "5", "debounce": 0, "value": 0, "dev": "input", "counter_mode": false, "time": 0}, {"circuit": "4", "debounce": 0, "value": 0, "dev": "input", "counter_mode": false, "time": 0}, {"circuit": "7", "debounce": 0, "value": 0, "dev": "input", "counter_mode": false, "time": 0}, {"circuit": "6", "debounce": 0, "value": 0, "dev": "input", "counter_mode": false, "time": 0}, {"circuit": "9", "debounce": 0, "value": 0, "dev": "input", "counter_mode": false, "time": 0}, {"circuit": "8", "debounce": 0, "value": 0, "dev": "input", "counter_mode": false, "time": 0}, {"value": 0, "pending": false, "circuit": "1", "dev": "relay"}, {"value": 0, "pending": false, "circuit": "3", "dev": "relay"}, {"value": 0, "pending": false, "circuit": "2", "dev": "relay"}, {"value": 0, "pending": false, "circuit": "5", "dev": "relay"}, {"value": 0, "pending": false, "circuit": "4", "dev": "relay"}, {"value": 0, "pending": false, "circuit": "7", "dev": "relay"}, {"value": 0, "pending": false, "circuit": "6", "dev": "relay"}, {"value": 0, "pending": false, "circuit": "8", "dev": "relay"}, {"interval": 2.0, "value": 0.0007828726445256769, "dev": "ai", "circuit": "1", "time": null, "bits": 18, "gain": 1}, {"interval": 1.0, "value": 0.0009563011322346285, "dev": "ai", "circuit": "2", "time": null, "bits": 18, "gain": 1}, {"value": 0, "frequency": 100, "circuit": "1", "dev": "ao"}, {"interval": 15, "value": 19.7, "circuit": "281893C00700005E", "address": "281893C00700005E", "time": 1480168545.079056, "typ": "DS18B20", "lost": false, "dev": "temp"}, {"interval": 15, "value": 13.95, "circuit": "282836C1070000DD", "address": "282836C1070000DD", "time": 1480168558.622758, "typ": "DS18B20", "lost": false, "dev": "temp"}, {"interval": 15, "value": 19.2, "circuit": "28B01DC107000045", "address": "28B01DC107000045", "time": 1480168557.206936, "typ": "DS18B20", "lost": false, "dev": "temp"}, {"interval": 15, "value": 19.95, "circuit": "2892844D07000012", "address": "2892844D07000012", "time": 1480168546.526963, "typ": "DS18B20", "lost": false, "dev": "temp"}]'

    s = source.decode("utf-8")
    data = json.loads(s)

    print(data[0])
    [/php]

  • Fall Du, aus welchen Gründen auch immer, tatsächlich den String in eine Liste von Strings zerlegen willst, würde ich folgendes vorschlagen:

    Code
    liste = [ e + "}" for e in string[1:-1].split("}, ") ]
    liste[-1]=liste[-1][:-1]

    Einmal editiert, zuletzt von Manul (26. November 2016 um 18:16)

  • Zunächst kurz woher die Daten stammen:

    ich habe ein UniPi Board an meinen Raspi angeschlossen und benutze die SW evok von unipi. Mit dem rest request kann ich alle Stati vom uniboard auf einmal auslesen. Um damit weiter zu arbeiten muss ich die Values (zb. einzelne Temeraturen) aus lesen.

    [code=php]#!/usr/bin/python

    import urllib.request
    import json

    url='http://10.0.0.50/rest/all/'
    print ('URL = ' + url)
    unipi = urllib.request.urlopen(url).read()
    unipi = (str(unipi))
    print(unipi)[/php]


    Der json Tipp war erfolgreich. Leider ging das aber nur auf dem ersten level. Die einzelnen device Sätze sind nicht kommplett json kompatibel, da einige Werte nicht in " " eingeschlossen sind. Muss wohl herausfinden wo man das in evok ändern kann. Man kann auch jedes device einzeln auslesen, hat dann dort aber das gleiche Problem. Siehe "value": 19.0

    [code=php]URL = http://10.0.0.50/rest/sensor/28B01DC107000045

    Temp1 = b'{"interval": 15, "value": 19.0, "circuit": "28B01DC107000045", "address": "28B01DC107000045", "time": 1480241871.437477, "typ": "DS18B20", "lost": false, "dev": "temp"}'[/php]

    Mal sehen was unipi sagt oder hat jemand das Problem gelöst.
    Man könnte auch den Satz manipulieren und die "" einfügen - ist aber unschön :(

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!