Regel tekst omzetten naar verschillende variabelen

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • Lion31
  • Registratie: December 2000
  • Laatst online: 09-06-2023
Hi!

Ik ben nogal nieuw op het gebied van Pyhton en loop helemaal vast met het volgende.

Ik gebruik mijn Domoticasysteem op een Raspberry Pi om de status van magneetcontacten en temperaturen uit een ander systeem te lezen. Dat lezen lukt wel, maar er komt een lange regel met tekst als output, en ik heb werkelijk geen idee hoe ik nu de juiste waarde in de juiste variabele krijg, zodat ik het door kan zetten naar mijn Domoticasysteem

De output voor de temperaturen/luchtvochtigheid ziet er als volgt uit:

[{u'temperature': 21.9, u'deviceLabel': u'2AJ4 YETY', u'humidity': 38.0, u'deviceType': u'SMOKE2', u'time': u'2017-01-13T22:03:53.000Z', u'deviceArea': u'Overloop'}, {u'temperature': 19.0, u'deviceLabel': u'2AJ4 YNCW', u'humidity': 42.0, u'deviceType': u'SMOKE2', u'time': u'2017-01-13T22:03:49.000Z', u'deviceArea': u'Zolder'}, {u'time': u'2017-01-14T00:07:26.000Z', u'deviceLabel': u'2S6H WUNU', u'deviceType': u'SIREN1', u'temperature': 20.0, u'deviceArea': u'Keuken'}, {u'time': u'2017-01-14T00:06:21.000Z', u'deviceLabel': u'2AJU 8S92', u'deviceType': u'VOICEBOX1', u'temperature': 21.2, u'deviceArea': u'Hal'}]

En voor de status van de magneetcontacten:

{u'doorWindowDevice': [{u'reportTime': u'2017-01-13T20:34:28.000Z', u'state': u'CLOSE', u'deviceLabel': u'2JG5 4H2P', u'wired': False, u'area': u'Voordeur'}, {u'reportTime': u'2016-12-31T12:34:06.000Z', u'state': u'CLOSE', u'deviceLabel': u'2JG5 AF2S', u'wired': False, u'area': u'Keukenraam'}, {u'reportTime': u'2017-01-13T17:49:07.000Z', u'state': u'OPEN', u'deviceLabel': u'2JG5 AJMG', u'wired': False, u'area': u'Slaapkamerraam'}, {u'reportTime': u'2016-12-18T12:32:43.000Z', u'state': u'CLOSE', u'deviceLabel': u'2JG5 46TU', u'wired': False, u'area': u'Kantoorruimte'}, {u'reportTime': u'2017-01-13T19:26:36.000Z', u'state': u'CLOSE', u'deviceLabel': u'2JG5 AHSM', u'wired': False, u'area': u'Achterdeur'}, {u'reportTime': u'2016-10-22T09:50:49.000Z', u'state': u'CLOSE', u'deviceLabel': u'2JG5 AHAK', u'wired': False, u'area': u'Meterkast'}, {u'reportTime': u'2017-01-09T16:53:54.000Z', u'state': u'CLOSE', u'deviceLabel': u'2JG5 49TQ', u'wired': False, u'area': u'Schuur'}], u'reportState': True}

Ik heb het vermoeden dat dit via een regular expression moet, maar hoe precies, kom ik niet uit. Misschien dat iemand mij de juiste richting op kan wijzen?

Alvast bedankt voor de moeite!

Groeten,

Martijn

3 dreaded words when making love: 'Honey, I'm home...'

Beste antwoord (via Lion31 op 14-01-2017 22:29)


  • Daos
  • Registratie: Oktober 2004
  • Niet online
Dan lijkt het inderdaad erop dat je geen json hebt, maar al de data in Python wat Raynman al zegt. Probeer eens print(temperaturen_luchtvochtigheid[0]['temperature'])

Alle reacties


Acties:
  • 0 Henk 'm!

  • Rannasha
  • Registratie: Januari 2002
  • Laatst online: 15:15

Rannasha

Does not compute.

De data ziet eruit alsof het in JSON formaat is. Python heeft libraries om met JSON data te werken. Google eens op "Python JSON".

Zelf een parse-functie schrijven lijkt mij het wiel opnieuw uitvinden.

|| Vierkant voor Wiskunde ||


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Lion31 schreef op zaterdag 14 januari 2017 @ 01:47:
Ik heb het vermoeden dat dit via een regular expression moet
Neen, neen en nog eens neen. Dit is, zoals gezegd, JSON en daar zijn libraries/packages/whatchamacallit's voor voor zowat elke taal en elk platform. Een regex is wel 't laatste wat je hier wil gebruiken.
Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems. - Jamie Zawinski

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 08:54
De functie loads() uit het JSON package parsed een JSON string naar een Python object. Voorbeeldje:

Python:
1
2
3
4
5
6
import json 

jsdata = "{'naam': 'Test', 'leeftijd': 30}"
data = json.loads(jsdata)

print(data['naam'])

[ Voor 49% gewijzigd door Morrar op 14-01-2017 10:00 ]


Acties:
  • 0 Henk 'm!

Verwijderd

De JSON die je daar hebt geplaatst is niet Valid.

Zo zie ik overal heel raar de "u" karakter staan en de haakjes moeten dubbel zijn. Ik heb "doorWindowdevice" maar even gepakt:
Zo hoort hij te zijn:


JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
 
{
   "doorWindowDevice":[
      {
         "reportTime":"2017-01-13T20:34:28.000Z",
         "state":"CLOSE",
         "deviceLabel":"2JG5 4H2P",
         "wired":false,
         "area":"Voorder"
      },
      {
         "reportTime":"2016-12-31T12:34:06.000Z",
         "state":"CLOSE",
         "deviceLabel":"2JG5 AF2S",
         "wired":false,
         "area":"Keukenraam"
      },
      {
         "reportTime":"2017-01-13T17:49:07.000Z",
         "state":"OPEN",
         "deviceLabel":"2JG5 AJMG",
         "wired":false,
         "area":"Slaapkamerraam"
      },
      {
         "reportTime":"2016-12-18T12:32:43.000Z",
         "state":"CLOSE",
         "deviceLabel":"2JG5 46T",
         "wired":false,
         "area":"Kantoorruimte"
      },
      {
         "reportTime":"2017-01-13T19:26:36.000Z",
         "state":"CLOSE",
         "deviceLabel":"2JG5 AHSM",
         "wired":false,
         "area":"Achterdeur"
      },
      {
         "reportTime":"2016-10-22T09:50:49.000Z",
         "state":"CLOSE",
         "deviceLabel":"2JG5 AHAK",
         "wired":false,
         "area":"Meterkast"
      },
      {
         "reportTime":"2017-01-09T16:53:54.000Z",
         "state":"CLOSE",
         "deviceLabel":"2JG5 49TQ",
         "wired":false,
         "area":"Schuur"
      }
   ],
   "reportState":true
}


Gebruik je toevallig Python 2 ? of 3 met unicode?
JSON is wel unicode en Python 2 heeft daar moeite mee.

Acties:
  • +3 Henk 'm!

  • Raynman
  • Registratie: Augustus 2004
  • Laatst online: 17:02
OP heeft nooit gezegd dat het JSON was. Met die u'' strings en boolean literals beginnend met een hoofdletter lijkt het inderdaad meer op een door Python 2 geprinte list met dicts erin.

De vraag is dan: krijg je dit echt zo als string (dan kun je misschien het daarvoor verantwoordelijke script aanpassen) of heb je zelf het resultaat van een of andere functie geprint om te kijken wat het is (dan kun je dus ipv printen gewoon met die list verder in je eigen script)?

Acties:
  • 0 Henk 'm!

  • Lion31
  • Registratie: December 2000
  • Laatst online: 09-06-2023
Ik heb, na alle goeie adviezen, mij verdiept in dat JSON verhaal, want wel kan kloppen.

Ik gebruik(te) inderdaad nog Pyhton 2. Met Python 3 ziet het er al een stuk meer uit als de lijst van Texamicz. Het "u" karakter is nu weg, maar er staan alleen enkele quotes in (kan wel kloppen, volgens de documentatie van de module op Github (https://github.com/persandstrom/python-verisure), in plaats van dubbele, waardoor de JSON module er toch nog in stikt en meld dat ie dubbele quotes verwacht.

Ik zal eens kijken of ik de originele module kan aanpassen, zodat ie dubbele quotes gebruikt. Of is er een makkelijkere manier om deze output toch door JSON te laten interpreteren met de enkele quote?

3 dreaded words when making love: 'Honey, I'm home...'


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Dan lijkt het inderdaad erop dat je geen json hebt, maar al de data in Python wat Raynman al zegt. Probeer eens print(temperaturen_luchtvochtigheid[0]['temperature'])

Acties:
  • 0 Henk 'm!

  • Lion31
  • Registratie: December 2000
  • Laatst online: 09-06-2023
Thanks Daos!

Dat is hem inderdaad voor wat betreft de temperatuur en de luchtvochtigheid. Alleen deze truck werkt (nog) niet voor de status van het doorWindowDevice.

3 dreaded words when making love: 'Honey, I'm home...'


Acties:
  • +1 Henk 'm!

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Is geen truc. Je moet gewoon kijken naar de structuur van de data: [] is een list en {} is een dictionary. Om iets uit de magneetcontacten te halen moet je zoiets doen: magneetcontacten['doorWindowDevice'][0]['area'].

Kijk ook eens op https://docs.python.org/3/tutorial/introduction.html#lists en https://docs.python.org/3...uctures.html#dictionaries

[ Voor 11% gewijzigd door Daos op 14-01-2017 21:32 ]


Acties:
  • 0 Henk 'm!

  • Lion31
  • Registratie: December 2000
  • Laatst online: 09-06-2023
Got it!

['doorWindow']['doorWindowDevice'][0]['state']

Dank allemaal voor het meedenken en meehelpen!!!

3 dreaded words when making love: 'Honey, I'm home...'

Pagina: 1