【问题标题】:Removing a string wrapper around pickled object?删除腌制对象周围的字符串包装?
【发布时间】:2019-03-10 21:49:47
【问题描述】:

在以下代码中:

>>> import pickle
>>>
>>> class Thing:
    def __init__(self):
        self.name = "stackoverflow"
        self.age = 11

>>> a = pickle.dumps(Thing())
>>> a
b'\x80\x03c__main__\nThing\nq\x00)\x81q\x01}q\x02(X\x04\x00\x00\x00nameq\x03X\r\x00\x00\x00stackoverflowq\x04X\x03\x00\x00\x00ageq\x05K\x0bub.'
>>> str(a)
"b'\\x80\\x03c__main__\\nThing\\nq\\x00)\\x81q\\x01}q\\x02(X\\x04\\x00\\x00\\x00nameq\\x03X\\r\\x00\\x00\\x00stackoverflowq\\x04X\\x03\\x00\\x00\\x00ageq\\x05K\\x0bub.'"

我的问题是,如何将str(a) 转换回a,因为一旦发生转换,我可以使用pickle.loads() 轻松解码

我转换为字符串的原因是我希望将str(a) 字符串添加到另一个将被进一步“腌制”的字符串。我看到的大多数其他帖子都假设字节已经是字符串的编码或字符串到字节的转换,但都不是。

【问题讨论】:

  • 只保留a,不要给它分配任何其他东西,然后你就可以使用它了。
  • 您可能无法安全地将另一个字符串添加到腌制对象字符串中。您想在这里实现什么目标?

标签: python python-3.x serialization pickle


【解决方案1】:

以下似乎可行,因为任意二进制字符串都是有效的latin1,它始终可以解码为 Unicode,然后再次编码回原始字符串(正如 Sven Marnachthis answer 中指出的那样)。

import pickle

class Thing:
    def __init__(self):
        self.name = "stackoverflow"
        self.age = 11

a = pickle.dumps(Thing())
str_a = a.decode('latin1')    
b = str_a.encode('latin1')

assert a == b

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    相关资源
    最近更新 更多