2017-09-20 1 views
0

受信データをPythonスクリプトに転送するデータベースから送信されたUDPストリームからデータを受信して​​います。UDPストリームから受信したデータオブジェクトから整数を抽出する

私がデータを受信するには、次のコードを使用しています:

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) 

データは(私が間違っている場合は、私を修正してください)バイトのようなオブジェクトとして返されます。データ変数を印刷すると、次のようなものになります。

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

をしかし、また、サーバから送信されたどのデータに応じて、次のようになります。

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

抽出する最も効率的な方法だろう何value=およびvalue2=の後の数値と、id(1505893008892590551)の後の数値を、このような辞書またはリストに格納しますか?

[1505893008892590551, 4123.4331, 123.5123] 

または

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

ジェネリックだろうと私はより多くの値が好ましいであろう追加しても動作します方法!

答えて

0

データは、「バイトのようなオブジェクト」

はいそのまま返されます。しかし、Python 2では、これは普通の文字列と同じです。 Python 3で文字列を取得するには、b'my text'.decode()を実行します。

Asumingは、あなたの両方の入力が

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) 

のように見えるかもしれ一致する

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' 

(両方の文字列)

使用正規表現

あなたの正規表現が気づくと思い:

  • 冗長な正規表現 - 空白やコメントを辞書はその後groupdictにアクセスすることができます

  • という名前のキャプチャグループ(?P<name>pattern)
  • 以外の撮影もオプションであるグループ(?:pattern)(その後疑問符)無視されます。

    >>> re.search(pattern, s1).groupdict() 
    {'ID': '1505893007463590886', 'Value2': None, 'Value': '10'} 
    >>> re.search(pattern, s2).groupdict() 
    {'ID': '1505893008892590551', 'Value2': '123.5123', 'Value': '4123.4331'} 
    
  • 関連する問題