将Pickle.dump输出到变量

11 投票
4 回答
10577 浏览
提问于 2025-04-18 07:32

我刚开始学Python,想知道有没有办法解决这个问题:

我知道这听起来有点奇怪,但我想把pickle.dump的数据保存到一个变量里。

我开始想,也许我可以通过创建一个假的类来实现,这样就可以把数据写入变量,而不是写入文件:

class PickleDatatoVar(object):
    def __init__(self):
        self.data = None
    def write(self, data):
        self.data = data
    def get(self):
        return self.data

然后:

pick = PickleDatatoVar()
pickle.dump(Int, pick)
var = pick.get()

没有出现错误,但输出的结果只是一个'.'

所以,有没有办法把数据保存到变量里,而不是保存到文件中呢?

4 个回答

1

我知道现在说这个有点晚,但我遇到了同样的问题,这里有一个我想到的解决办法。抱歉我的英语不好。

在你的代码中添加这个类

class DataPacket:
    def __init__(self):
        pass

    def write(self, string):
        self._string = string

    @property
    def string(self):
        return self._string

然后在你保存处理结果的地方使用这个

    PickeledString = DataPacket()
    pickle.dump(dataJSON, PickeledString)

要读取它,使用这个

PickeledString.string
2

我在StackOverflow上找到了Farhan K写的一个简单明了的解释,内容可以在这里查看:

import pickle

mydict = { 'a': 1111, 'b': 2222 }
string_of_bytes_obj = str(pickle.dumps(mydict), encoding="latin1")

unpickled_dict = pickle.loads(bytes(string_of_bytes_obj, "latin1"))
3

这里有一些代码片段,使用了 pickle.dump(),如果你需要的话可以参考:

将 pickle_obj 的内容保存到字节或字符串变量中

bytes_output = BytesIO()
pickle.dump(pickle_obj, model_bytes)
bytes_output_base64 = base64.b64encode(model_bytes.getvalue()).decode() # convert the bytes to base64 string
bytes_output.close()

从一个 base64 字符串(在 pickle_data 中)加载到 pickle_obj

pickle_bytes = BytesIO(base64.b64decode(pickle_data))
pickle_obj = pickle.loads(pickle_bytes.read())
pickle_bytes.close()

希望这些对你有帮助!

17

你想要一个内存中的文件对象。在Python 2中,这个对象是cStringIO.StringIO(),而在Python 3中则是io.BytesIO()。它们的作用和文件对象一样,你可以用pickle.dump()把数据写入这些对象。

不过,更简单的方法是直接使用pickle.dumps(),这样可以直接把数据保存为一个字符串对象。

从底层来看pickle.dumps()为你做的事情是创建一个内存中的文件对象,把数据写入其中,然后把结果以字符串的形式返回给你;你可以查看源代码

def _dumps(obj, protocol=None, *, fix_imports=True):
    f = io.BytesIO()
    _Pickler(f, protocol, fix_imports=fix_imports).dump(obj)
    res = f.getvalue()
    assert isinstance(res, bytes_types)
    return res

这样你就不需要自己做那些额外的工作了。

撰写回答