ImportError:没有名为copy_reg pickle的模块

Ste*_*nds 20 python pickle

我正在尝试在MySQL数据库中取消存储为blob的对象.我手动生成并将pickled对象存储在数据库中,但是当我尝试unpickle对象时,我得到以下相当神秘的异常:

ImportError:没有名为copy_reg的模块

关于为什么会这样的想法?

复制方法

注意:必须在Windows PC上执行步骤1,在Linux PC上执行步骤3和4.

1)在Windows PC上:

file = open("test.txt", "w")
thing = {'a': 1, 'b':2}
cPickle.dump(thing, file)
Run Code Online (Sandbox Code Playgroud)

2)手动将text.txt的内容插入到linux上运行的MySQL数据库的blob字段中

3)在Linux机器上运行的Python中,从MySQL获取列的内容

4)假设您将blob列的内容放入名为data的变量中,请尝试以下操作:

cPickle.loads(rawString)
Run Code Online (Sandbox Code Playgroud)

Ste*_*nds 23

这似乎可能是由我导出pickle对象的方法引起的.

此错误报告表明可以通过导出到以二进制模式写入的文件来解决我的问题.我现在要开始,看看这是否解决了我的问题.

更新:这是有效的.解决方案是确保将pickle对象导出到以二进制模式打开的文件,即使您使用的是默认协议0(通常称为"text")

根据所讨论的orignal示例更正代码:

file = open("test.txt", 'wb')
thing = {'a': 1, 'b':2}
cPickle.dump(thing, file)
Run Code Online (Sandbox Code Playgroud)


小智 15

另外,简单地在(windows创建的)pickle文件上运行dos2unix(在linux下)解决了我的问题.(没有试过开放模式'wb'的事情.)丹