保存的数据为类对象时需要注意路径问题
实用时错误产生原因:
用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
文件夹中即可:
此时结果:
可以看到,此时该类的信息已经包含进来了。