如何在Python中保存对象而不使用pickle?

2024-10-03 23:24:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我想将一个对象保存在一个文件中,以便以后(程序关闭后)使用它。你知道吗

我试着用pickle,但看起来它不像我的对象:D

Traceback (most recent call last):
  File "(path)", line 4, in <module>
    pickle.dump(object, f)
AttributeError: Can't pickle local object '_createenviron.<locals>.encodekey'

代码如下:

import pickle
object = MyWeirdClass()
with open("data.pickle", "wb") as f:
    pickle.dump(object, f)

还有其他保存对象的方法吗(如外部库)? 我做错了什么而我犯了这个错误? 我的MyWeirdClass()类运行得非常好,我对它进行了多次测试,结果完全符合我的预期。你知道吗

编辑:

我发现问题是对象的一个变量是selenium.webdriver.chrome浏览器.webdriver.webdriver文件 对象。在删除这个对象之后(在做了我想要的事情之后),它工作得很好。你知道吗

第二次编辑:

我也有一个错误:

RecursionError: maximum recursion depth exceeded while pickling an object

在代码行中,我试图将对象写入文件。你知道吗

我发现我必须设置系统设置递归限制()设置为更高的值,因此在没有错误之前,我不将其设置为随机值,而是执行以下操作:

import pickle
import sys
default_cursion_limit = sys.getrecursionlimit()# defalut is 1000
object = MyWeirdClass()
while True:
    try:
        with open("data.pickle", "wb") as f:
            pickle.dump(object, f)
        break
    except RecursionError:
        default_cursion_limit += 50
        sys.setrecursionlimit(default_cursion_limit)# looks like its working with 2600

Tags: 文件对象代码importdefaultobject错误with
1条回答
网友
1楼 · 发布于 2024-10-03 23:24:27

最简单的解决方案是以可pickle的方式定义类。错误消息表明类的某些属性不能被pickle,因为它们没有全局作用域名称。你知道吗

如果要保存不可pickle的对象,则需要编写自己的逻辑来序列化和反序列化它。在没有看到对象的情况下给出具体的建议是不可能的,但是一般的想法是,您需要弄清楚如何将对象的状态表示为可以pickle的东西(比如一系列简单的string/int属性),然后编写一个函数,从该数据中重构对象。你知道吗

相关问题 更多 >