pickle中保存加载类对象时可能发生的错误

保存的数据为类对象时需要注意路径问题

实用时错误产生原因:

用pickle dump()封装类对象,并将数据保存,然后在另一个文件夹中解析数据时产生数据能拿到,但不能正确解析出类对象。后来发现是缺少了对应的类对象,并且类对象要和打包时的类对象路径保持一致。

pickle.dumps()或pickle.dump()封装时,会根据你所加载的类对象对数据进行对象化,同时也会把类对象的路径也打包进去,记录下它是根据那个目录下的哪个类进行封装的,同样解析时也要找到对应目录下的对应类进行解析还原。

在同一个项目或文件中能完全使用,因为类对象路径没有变化。

代码:

输出结果


同一目录(pickle_save)下存储和加载没有问题;

当再pickle_save文件夹下存储,在pickle_load文件夹下想读取时,

输出结果

Traceback (most recent call last):
  File "new_entity_pattern/pickle_load/pickle_test.py", line 4, in 
    data1 = pkl.load(file)
ModuleNotFoundError: No module named 'model'

这是由于将类Data 的信息保存到pkl文件时,将该类的相对路径一起保存入pkl文件。在load时,会先检查该Data类,根据该类的格式进行解析pkl文件。而pickle_load中已经没有该类声明的文件,所以在load时报错ModuleNotFoundError: No module named 'model'

解决办法:

model.py文件拷贝至pickle_load文件夹中即可:

此时结果:


可以看到,此时该类的信息已经包含进来了。

参考链接


 上一篇
2021 Hyperbolic Geometry is Not Necessary/ Lightweight Euclidean-Based Models for Low-Dimensional Knowledge Graph Embeddings 阅读笔记 2021 Hyperbolic Geometry is Not Necessary/ Lightweight Euclidean-Based Models for Low-Dimensional Knowledge Graph Embeddings 阅读笔记
0. 前言Topichyperbolic geometry;KGE; motivationHowever, the necessity of hyperbolic space in KGE is still questionable, be
下一篇 
Learning Hierarchy-Aware Knowledge Graph Embeddings for Link Prediction论文阅读笔记 Learning Hierarchy-Aware Knowledge Graph Embeddings for Link Prediction论文阅读笔记
0. 前言1. 作者试图解决什么问题?作者想在KGE中对语义层级(semantic hierarchies)进行建模。 2. 这篇论文的关键元素是什么?semantic hierarchy, polar coordinate system
  目录