2010-10-19 25 views
7

我想製作(並解碼)由多個python pickles組成的單個字符串。Python Pickle有一個可以用作分隔符的非法字符/序列嗎?

是否有可以安全使用的字符或序列作爲此字符串中的分隔符?

我應該能夠做出像這樣的字符串:

s = pickle.dumps(o1) + PICKLE_SEPARATOR + pickle.dumps(o2) + PICKLE_SEPARATOR + pickle.dumps(o3) ... 

我應該能夠把這個字符串和重建的對象,像這樣:

[pickle.loads(s) for s in input.split(PICKLE_SEPARATOR)] 

我應該PICKLE_SEPARATOR是什麼?


對於好奇,我想送醃製對象使用追加到Redis的。 (雖然也許我只是使用RPUSH)

+0

由於Redis的值可以是字符串的集合,你爲什麼不只是存儲每一個單獨? – martineau 2010-10-20 14:17:14

回答

-1

一個解決方案是將你的醬菜串加上關於每個組成元素包含多少個字符的數據。

2

我不使用Python很多,但有沒有一個原因,你不能只醃一個數組呢?所以酸洗變得

s = pickle.dumps([o1,o2,o3]) 

和重建變得

objs = pickle.loads(s) 

編輯1:此外,根據this answer,醃輸出是自終止;因此,你可以用

s = ''.join(map(pickle.dumps,[o1,o2,o3])) 

醃製和恢復與

import StringIO 
sio = StringIO.StringIO(s) 
objs = [] 
try: 
    while True: objs.append(pickle.load(sio)) 
catch EOFError: 
    pass 

我不知道有這個好處,但。 (雖然我沒有看到一個,有可能比那個討厭的循環/異常組合有更好的方式,就像我說的,我沒有太多使用Python)。

+0

不幸的是,這不適用於流。我需要單獨閱讀字符串,因爲我不能使用pickle'load',只能'加載' – VF1 2018-01-01 22:30:22

2

編輯:首先考慮gnibbler的回答,這顯然更簡單。選擇下面的唯一原因是如果你想分解一系列的醬菜而不分析它們。

一個相當安全的賭注是使用全新的UUID,你永遠不會在其他地方重複使用。評估uuid.uuid4().bytes一次,並將結果作爲分隔符存儲在代碼中。例如: -

>>> import uuid 
>>> uuid.uuid4().bytes 
'\xae\x9fW\xff\x19cG\x0c\xb1\xe1\x1aV%P\xb7\xa8' 

然後將得到的字符串文字複製粘貼到你的代碼作爲分隔符(甚至只使用一個以上的,如果你想)。幾乎可以保證,任何你想存儲的東西都不會出現相同的序列。

7

它的優良只是鏈狀鹹菜一起,Python知道其中每一個結束

>>> import cStringIO as stringio 
>>> import cPickle as pickle 
>>> o1 = {} 
>>> o2 = [] 
>>> o3 =() 
>>> p = pickle.dumps(o1)+pickle.dumps(o2)+pickle.dumps(o3) 
>>> s = stringio.StringIO(p) 
>>> pickle.load(s) 
{} 
>>> pickle.load(s) 
[] 
>>> pickle.load(s) 
() 
+2

一個潛在的問題:這不適用於字符串,只適用於文件類對象:try'pickle.load(s)''三次,只有'dict'被返回。 – 2010-10-20 08:47:50

相關問題