我正在从数据库发送的 UDP 流中接收数据,该数据库将其传入的数据转发到Python脚本。
我正在使用以下代码来接收数据:
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 :(得分:0)
数据作为“类字节对象”返回
是的。但是,在Python 2中,这与普通字符串相同。要在Python 3中获取字符串,请执行b'my text'.decode()
。
然后
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'
(两个字符串)
与您的两个输入相匹配的正则表达式可能类似于
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)
想要注意:
(?P<name>pattern)
(?:pattern)
,也是可选的(之后是问号)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'}