2010-04-01 28 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