Python Pickle有没有非法字符/序列可以用作分隔符?
我想把几个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应该是什么呢?
顺便说一下,我想用APPEND把pickle对象发送到redis。(不过我可能会直接用RPUSH)
5 个回答
2
我不太用Python,但有没有可能直接把数组进行序列化呢?这样序列化的过程就变成了
s = pickle.dumps([o1,o2,o3])
而重建的过程就变成了
objs = pickle.loads(s)
编辑 1:另外,根据 这个回答,序列化的输出是自我结束的;所以,你可以用
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。)
2
编辑: 首先考虑一下gnibbler的回答,那显然要简单得多。下面这个方法只有在你想要分割一串pickle而不想解析它们时才更合适。
比较安全的做法是使用一个全新的UUID,这个UUID在其他地方绝对不再使用。你可以执行一次 uuid.uuid4().bytes
,然后把结果存储在你的代码里作为分隔符。例如:
>>> import uuid
>>> uuid.uuid4().bytes
'\xae\x9fW\xff\x19cG\x0c\xb1\xe1\x1aV%P\xb7\xa8'
然后把生成的字符串直接复制粘贴到你的代码中作为分隔符(或者如果你愿意,也可以直接使用上面的那个)。几乎可以保证,你存储的任何东西中都不会出现相同的序列。
8
把这些腌黄瓜(pickles)直接连在一起是没问题的,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)
()