【发布时间】:2013-12-07 17:55:05
【问题描述】:
我刚刚从源代码编译并安装了 pandas(克隆的 github 存储库,>>> setup.py install)。
碰巧模块pickle 的对象序列化/反序列化的默认行为发生了变化,可能部分被pandas 内部模块覆盖。
我有很多通过“标准”pickle 序列化的数据类,显然我不能再反序列化了;特别是,当我尝试反序列化一个类文件(肯定工作)时,我得到了这个错误
In [1]: import pickle
In [2]: pickle.load(open('pickle_L1cor_s1.pic','rb'))
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-2-88719f8f9506> in <module>()
----> 1 pickle.load(open('pickle_L1cor_s1.pic','rb'))
/home/acorbe/Canopy/appdata/canopy-1.1.0.1371.rh5-x86_64/lib/python2.7/pickle.pyc in load(file)
1376
1377 def load(file):
-> 1378 return Unpickler(file).load()
1379
1380 def loads(str):
/home/acorbe/Canopy/appdata/canopy-1.1.0.1371.rh5-x86_64/lib/python2.7/pickle.pyc in load(self)
856 while 1:
857 key = read(1)
--> 858 dispatch[key](self)
859 except _Stop, stopinst:
860 return stopinst.value
/home/acorbe/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/pandas-0.12.0_1090_g46008ec-py2.7-linux-x86_64.egg/pandas/compat/pickle_compat.pyc in load_reduce(self)
28
29 # try to reencode the arguments
---> 30 if self.encoding is not None:
31 args = tuple([ arg.encode(self.encoding) if isinstance(arg, string_types) else arg for arg in args ])
32 try:
AttributeError: Unpickler instance has no attribute 'encoding'
我有相当大的代码依赖于此,但它崩溃了。有什么快速的解决方法吗?我怎样才能再次获得默认的泡菜行为?
任何帮助表示赞赏
编辑:
我意识到我愿意解开的是一个字典列表,其中每个包含几个 DataFrames。这就是熊猫发挥作用的地方。
我通过@Jeff github.com/pydata/pandas/pull/5661 应用了补丁。 出现另一个错误(可能与this 有关)。
In [4]: pickle.load(open('pickle_L1cor_s1.pic','rb'))
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-4-88719f8f9506> in <module>()
----> 1 pickle.load(open('pickle_L1cor_s1.pic','rb'))
/home/acorbe/Canopy/appdata/canopy-1.1.0.1371.rh5-x86_64/lib/python2.7/pickle.pyc in load(file)
1376
1377 def load(file):
-> 1378 return Unpickler(file).load()
1379
1380 def loads(str):
/home/acorbe/Canopy/appdata/canopy-1.1.0.1371.rh5-x86_64/lib/python2.7/pickle.pyc in load(self)
856 while 1:
857 key = read(1)
--> 858 dispatch[key](self)
859 except _Stop, stopinst:
860 return stopinst.value
/home/acorbe/Canopy/appdata/canopy-1.1.0.1371.rh5-x86_64/lib/python2.7/pickle.pyc in load_reduce(self)
1131 args = stack.pop()
1132 func = stack[-1]
-> 1133 value = func(*args)
1134 stack[-1] = value
1135 dispatch[REDUCE] = load_reduce
TypeError: _reconstruct: First argument must be a sub-type of ndarray
Pandas 版本的编码数据是(来自 Canopy 包管理器)
Size: 7.32 MB
Version: 0.12.0
Build: 2
Dependencies:
numpy 1.7.1
python_dateutil
pytz 2011n
md5: 7dd4385bed058e6ac15b0841b312ae35
我不确定我能否提供我试图解压的文件的最小示例。 它们非常大(O(100MB))并且它们具有一些非平凡的依赖关系。
【问题讨论】:
-
你能显示你所做的确切代码以及泡菜文件吗(如果你可以的话,来自 Dropbox 的链接)
-
你可以在加载 pandas 之前解压(作为一种解决方法)
-
@Jeff,我发布的正是我使用的代码。没有明确涉及熊猫。在我完成 pandas 安装后,加载我正在使用的文件的 unpickle 调用(甚至与 pandas 无关)崩溃了。文件大于 100mb
-
我需要一些东西来重现。您必须在此之前加载熊猫,否则代码将不存在。你能发布一个文件的链接吗?
-
试试这个分支(或者你可以暂时编辑代码,只有几行),lmk:github.com/pydata/pandas/pull/5661