【问题标题】:How to save objects in Python without using pickle?如何在不使用 pickle 的情况下在 Python 中保存对象?
【发布时间】:2019-11-10 00:24:48
【问题描述】:

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

我尝试使用 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

在代码行中,我尝试将对象写入文件。

我发现我必须将 sys.setrecursionlimit() 设置为更高的值,因此在没有错误之前将其设置为随机值,我这样做:

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

【问题讨论】:

  • 我们需要查看您的对象。你能粘贴MyWeirdClass()的代码吗?
  • 它就像 90 大行代码,真的很重要吗?如果有帮助,对象的变量之一是对象列表。
  • 感谢大家的 cmets,但我发现了问题所在(见帖子)。

标签: python object pickle


【解决方案1】:

最简单的解决方案是以可腌制的方式定义您的类。该错误消息表明您的某些类的属性无法腌制,因为它们没有全局范围的名称。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 2019-12-29
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多