2017-09-20 2 views
0

Je reçois des données d'un flux UDP envoyé à partir d'une base de données qui transmet ses données entrantes à un script Python.Extrait un entier de l'objet de données reçu du flux UDP

J'utilise le code suivant pour recevoir les données:

import socket 

UDP_IP = "localhost" 
UDP_PORT = 5060 
sock = socket.socket(socket.AF_INET, # Internet 
socket.SOCK_DGRAM) 
sock.bind((UDP_IP, UDP_PORT)) 

while True: 
    data, addr = sock.recvfrom(1024) 
    print (data) 

Les données sont renvoyées sous forme d'objet comme octet (s'il vous plaît me corriger si je me trompe). Impression de la variable de données ressemblerait à quelque chose comme ceci:

b'nulldata,country=swe,region=europe,tag=tagged value=10 1505893007463590886' 

Mais pourrait aussi ressembler à cela en fonction de ce que les données sont envoyées à partir du serveur:

b'nulldata,country=swe,region=europe,tag=tagged value=4123.4331,value2=123.5123, 1505893008892590551' 

Quelle serait la façon la plus efficace d'extraction de la valeur numérique après value= et value2= ainsi que le id (1505893008892590551) et le stocker dans un dictionnaire ou une liste qui ressemblerait à quelque chose comme ça?

[1505893008892590551, 4123.4331, 123.5123] 

ou

{'ID': 1505893008892590551, 'Value': 4123.4331, 'Value2': 123.5123} 

Une méthode qui serait générique et fonctionnerait même si j'ajouté plus de valeurs seraient préférées!

Répondre

0

Les données sont renvoyées en tant que « objet octet comme »

Oui il est. En Python 2, cependant, c'est la même chose que la chaîne ordinaire. Pour obtenir une chaîne dans Python 3, faites b'my text'.decode().

Asuming puis

s1 = 'nulldata,country=swe,region=europe,tag=tagged value=10 1505893007463590886' 
s2 = 'nulldata,country=swe,region=europe,tag=tagged value=4123.4331,value2=123.5123, 1505893008892590551' 

(les deux cordes)

Utilisez regex

Votre regex qui correspond à vos deux entrées peuvent ressembler à

pattern = re.compile(r''' 
    value=(?P<Value>[0-9.]+)   # capture `value` 
    (?:,value2=(?P<Value2>[0-9.]+))? # optionally capture `value2` 
    ,?\         # optional comma and a space 
    (?P<ID>\d+)$      # capture `id` at the end 
    ''', re.VERBOSE) 

Thinks à remarquer:

  • regex verbeux - espaces blancs et les commentaires sont ignorés
  • groupe capture du nom (?P<name>pattern)
  • groupe non capture (?:pattern) qui est également en option (point d'interrogation après)

Dictionnaire peut alors être consulté avec groupdict:

>>> re.search(pattern, s1).groupdict() 
{'ID': '1505893007463590886', 'Value2': None, 'Value': '10'} 
>>> re.search(pattern, s2).groupdict() 
{'ID': '1505893008892590551', 'Value2': '123.5123', 'Value': '4123.4331'}