2014-03-19 138 views
1

我想通过UDP/TCP发送一个列表,但由于它们只支持字符串列表,我需要将列表转换为字符串并将其转换回来。如何将列表转换为字符串,然后将其转换回python?

我的名单就像是

['S1','S2','H1','C1','D8'] 

我知道我可以使用

string_ = ''.join(list_) 

将其转换成字符串。

但如何将其转换回来?

或者还有另一种方法可以使用UDP/TCP发送列表?

+0

你的列表是否总是包含字符串,或者它是否可以包含其他类型的对象(如果是,哪些类型)? – NPE

+0

无论你做什么,都不要使用'pickle',因为它不安全:有人发送恶意输入到你的UDP/TCP服务器可能会在你的盒子上运行任意代码。请参阅http://stackoverflow.com/questions/10302247/understanding-python-pickle-insecurity – NPE

回答

0

也许你可以在列表元素之间附加一个分隔符,然后使用它调用split来获取列表。

编辑:

由于@Eric福廷在他的回答mentionned,隔板应是一种不能在你的字符串。一种可能性是 - 正如他所建议的 - 使用编码。另一种可能性是逐个发送元素,但这显然会增加通信开销。

请注意,您的分隔符可能是一个序列,它不需要是单个字符。

str_list = separator.join(list_) 
new_list = str_list.split(separator) 

如果您知道列表元素的格式,您甚至可以不使用分隔符!

str_list = "".join(list_) 
re.split(reg_exp, str_list) 
1

使用分隔符:

string_ = ';'.join(list_) 

list_ = string_.split(';') 

你需要确保的分隔符不能成为你的字符串中。如果是这样,您可能需要编码。

3

自定义格式将取决于有关列表项格式的假设,所以json看起来最安全的方式去:

>>> import json 
>>> data = json.dumps(['S1','S2','H1','C1','D8']) 
>>> data 
'["S1", "S2", "H1", "C1", "D8"]' 
>>> json.loads(data) 
[u'S1', u'S2', u'H1', u'C1', u'D8'] 
0

如果您对网络通信的两端蟒蛇,你可以使用dumps和从pickle模块设计loads功能特别用于序列化Python对象:

import pickle 

a = ['S1','S2','H1','C1','D8'] 
string_ = pickle.dumps(a) 

... 

a = pickle.loads(string_) 

否则solution提出@bereal更好,因为大多数编程语言都有json库。但是它需要对json不支持的数据类型进行一些处理。

编辑

由于@bereal注意到可能存在的安全性问题,因为pickle它实际上是一种可执行的语言。

+1

泡菜和网络的一个问题是,它实际上是[可执行语言](http://lincolnloop.com/blog/playing- pickle-security /),所以任何人都可以在服务器端注入任意代码。 – bereal

+0

@bereal,好点。不知道。 – citxx