2010-04-01 80 views
4

我正在寻找包装的一种简单的方法/拆包数据结构在网络上发送发送列表/字典通过网络蟒蛇:</p> <p>在客户端只发送前:

a = ((1,2),(11,22,),(111,222)) 
message = pack(a) 

和然后在服务器上:

a = unpack(message) 

有没有可以打包/解包魔法的图书馆? 在此先感谢

回答

12

看起来像JSON可能适合该法案。这很简单,并it's in the Python standard library

它可能不是太高兴的元组,虽然:

>>> import json 
>>> a = ((1,2),(11,22,),(111,222)) 
>>> print a 
((1, 2), (11, 22), (111, 222)) 
>>> message = json.dumps(a) 
>>> message 
'[[1, 2], [11, 22], [111, 222]]' 
>>> b = json.loads(message) 
>>> b 
[[1, 2], [11, 22], [111, 222]] 

无论这是一个问题你来决定。

+0

谢谢。看起来像我需要的。 – facha 2010-04-01 17:45:04

+3

+1:JSON甚至YAML绝对是一种方式。 YAML将保持元组不变为序列化列表,但它不是标准包。对于应该是人类可读的东西(比如配置文件),我肯定会去YAML。 – van 2010-04-01 17:52:24

+0

@van不,YAML不能将元组保留为元组而不使用不安全标签。使用不安全标签对于网络通信来说是一个可怕的想法,因为腌菜就是这样。除了少数例外。而且,实际上,如果您要在YAML中使用特定于语言和不安全的标记,那么YAML会如何使用pickle? – 2010-04-01 17:57:58

2

pickle - Python的对象序列化:

pickle模块实现了序列化和反序列化Python对象结构的根本,但强大的算法。 “Pickling”是将Python对象层次结构转换为字节流的过程,“unpickling”是相反的操作,即字节流转换回对象层次结构。酸洗(或取消)也称为“序列化”,“编组”或“扁平化”,但为了避免混淆,此处使用的术语是“酸洗”和“取消”。

+4

警告:如果你不信任发件人,请不要使用泡菜。 – cobbal 2010-04-01 17:45:23

+2

因为cobbal说,pickle对于网络通信来说几乎总是错误的。从腌制文件:'警告:腌制模块不是为了防止错误或恶意构建的数据。切勿取消接收来自不可信或未经认证的信息源的数据。“鉴于在客户端 - 服务器通信中,几乎不可能知道客户端是您的想法,软件方面,这个答案根本不对。 (有特殊的例外情况,比如只有一个人可以连接,并且你知道他是谁,那种事情)。 – 2010-04-01 17:52:48

1

ast.literal_eval()保存的元组:

>>> a = ((1,2),(11,22,),(111,222)) 
>>> s = repr(a) 
>>> import ast 
>>> ast.literal_eval(s) 
((1, 2), (11, 22), (111, 222)) 
+1

以较低的速度作为权衡:https://gist.github.com/3134391 – schlamar 2012-12-20 14:01:29