我正在尝试腌制一个非常大的对象,但遇到了以下错误(python 3.8.5):
TypeError: cannot pickle '_io.TextIOWrapper' object
我设法将其范围缩小到一个简单的例子:
test.yaml(无关):
Hello there: General Kenobi
Universe: 42
问题在这里:
import pickle
from ruamel.yaml import YAML
class C:
def __init__(self):
self.yaml = YAML()
with open("test.yaml", 'r') as yamlFile:
self.my_yaml = self.yaml.load(yamlFile)
c = C()
with open("test.pkl", 'wb') as output:
pickle.dump(c, output, pickle.HIGHEST_PROTOCOL)
据我猜测,self.yaml 包含对文件流的引用。 问题是我已经将此文件加载到我的对象中并且不需要存储它。
有办法避免这种行为吗?
我可以在酸洗之前删除 yaml 实例,然后重新实例化一个实例,但我宁愿将其包含在内。
编辑:
上面的代码片段只是一种轻松重现错误的方法。 我实际上使用一个对象来存储 YAML 和派生字典方法。其他对象调用这个实例来处理/转储它们的字典。 yaml 实例保存在属性中,因为我添加了其他方法可以使用的表示。 如果实例只是本地的,我需要重新定义每个方法中的所有自定义
我不确定为什么将
YAML()
实例分配给 C
实例的属性,您可以只使用 __init__
本地的普通变量,并且酸洗不会尝试转储它:
import pathlib
class C:
def __init__(self):
yaml = YAML()
yaml_file = pathlib.Path('test.yaml')
self.my_yaml = yaml.load(yaml_file)