2016-03-09 48 views
2

我目前正在使用python从一个树莓派将一个python字典传输到另一个433Mhz链接上,使用虚拟线路(vw.py)发送数据。从字符串中提取字典键值

vw.py的问题是发送的数据是字符串格式。

我成功接收PI_no2上的数据,现在我正在尝试重新格式化数据,以便它可以放回到字典中。

我创建了一个小片段来进行测试,并创造了它收到来自vw.py

到目前为止,我已经成功地分割字符串在结肠相同格式的临时字符串,而我现在试图摆脱双引号,没有太大的成功。

my_status = {} 
#temp is in the format the data is recieved 
temp = "'mycode':['1','2','firstname','Lastname']" 

key,value = temp.split(':') 
print key 
print value 

key = key.replace("'",'') 
value = value.replace("'",'') 

my_status.update({key:value}) 

print my_status 

给出结果

'mycode' 
['1','2','firstname','Lastname'] 
{'mycode': '[1,2,firstname,Lastname]'} 

我需要的价值是在格式

['1','2','firstname','Lastname'] 

但带摆脱所有的单语音标记。

+0

使用'ast.literal_eval',也许在开始和结束时加上'{'和'}'这是一本字典,但它会安全地评估它 –

+2

您是否尝试过使用JSON? –

+0

,或者你可以[pickle](https://docs.python.org/2/library/pickle.html)更复杂的数据结构(但是Python特定的)数据结构。 –

回答

2

您可以使用ast.literal_eval

import ast 
temp = "'mycode':['1','2','firstname','Lastname']" 
key,value = map(ast.literal_eval, temp.split(':')) 
status = {key: value} 

将输出

{'mycode': ['1', '2', 'firstname', 'Lastname']} 
+0

这完美的作品。谢谢你的快速反应。 – user2624229

0

这不应该是很难解决的问题。您需要做的是strip[ ]分开列表字符串,然后split,。完成此操作后,迭代元素将其添加到列表中。您的代码应该是这样的:

string = "[1,2,firstname,lastname]" 
string = string.strip("[") 
string = string.strip("]") 
values = string.split(",") 
final_list = [] 
for val in values: 
    final_list.append(val) 
print final_list 

这将返回:

> ['1','2','firstname','lastname'] 

然后取这个列表并将其插入到你的字典里:

d = {} 
d['mycode'] = final_list 

这种方法的优点是,您可以独立处理每个值。如果您需要将12转换为int,那么您将能够做到这一点,而将另外两个作为str

0

除了cricket_007建议使用语法树分析器 - 您的格式与标准yaml格式非常相似。这是一个非常轻便,intutive框架,所以我会建议它

a = "'mycode':['1','2','firstname','Lastname']" 
print yaml.load(a.replace(":",": ")) 
# prints the dictionary {'mycode': ['1', '2', 'firstname', 'Lastname']} 

这是你的格式和YAML之间唯一不同的是结肠需要一个空间

它也将原始数据类型之间的区别的你,如果这很重要。将报价放在12左右,并确定它们是数字。

Tadhg McDonald-Jensen在评论中建议pickling。这将允许你存储更复杂的对象,虽然你可能会失去你已经试验过的人类可读格式