python 2 和 python 3 pickle 的兼容性问
2019-02-27 本文已影响0人
虚胖一场
由于工作原因,需要在 python 3 下用 pickle.load
或pickle.loads
方法反序列化在 python 2 下用 cPickle.dump
或 cPickle.dumps
方法序列化的对象。
当对象类型是 numpy 的 array、pandas 的 DataFrame 和 Series,以及 datetime、date、time 时,会报 UnicodeDecodeError。根据官方文档,反序列化时设置 encoding='latin1'
可解决这一问题。
但经过实测,当对象为 datetime 类型时,使用上述设置,在 python 3.6.8 和 python 3.7.2 下可以正确运行,但在 python 3.6.5 和 python 3.7.0 下则会报 TypeError。此外,当设置 encoding='bytes'
时,上述四个 python 版本下均可正确运行,但该设置无法反序列化 array、DataFrame 和 Series。如果你的对象是一个既包含 datetime、又包含 array 的复杂对象,而你的环境又刚刚好是 python 3.6.5 或 python 3.7.0,那么就只能掀桌子了。(完