pickle unable to load collection
Peter Otten
__peter__ at web.de
Tue May 18 03:10:24 EDT 2010
paragk wrote:
> Hi,
>
> I am unable to figure out the cause of python pickle unable to find
> the collection module.
>
> I am getting
>
> __import__(module)
> ImportError: No module named collections
>
> when I try to load a pickled object.
>
> Details:
>
> Python version:
>
> Python 2.6 (r26:66721, Oct 2 2008, 11:35:03) [MSC v.1500 32 bit
> (Intel)] on win32
>
>
> [CODE]
>
> import sys
> import glob
> import collections
> import pickle
>
> ...
>
> SomeListDict = collections.defaultdict(list)
>
> ... # Populate SomeListDict
>
> DictFile = open (options.saveDict, 'w')
> pickle.dump(SomeListDict , DictFile, -1)
> DictFile.close()
[...]
> From the above analysis, clearly the collection module exists, since
> the dump works.
>
> What am I missing?
You have to open the file in binary mode "wb".
>>> import collections
>>> import pickle
>>> data = pickle.dumps(collections.defaultdict())
>>> pickle.loads(data)
defaultdict(None, {})
Now simulate the effect of writing in text mode and reading in binary mode:
>>> garbled_data = data.replace("\n", "\r\n")
>>> pickle.loads(garbled_data)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.6/pickle.py", line 1374, in loads
return Unpickler(file).load()
File "/usr/lib/python2.6/pickle.py", line 858, in load
dispatch[key](self)
File "/usr/lib/python2.6/pickle.py", line 1090, in load_global
klass = self.find_class(module, name)
File "/usr/lib/python2.6/pickle.py", line 1124, in find_class
__import__(module)
ImportError: No module named collections
>>> try: pickle.loads(garbled_data)
... except ImportError as e:
... e
...
ImportError('No module named collections\r',)
So as Steven suspected there was a whitespace char in the module name:
pickle.load() was looking for the "collections\r" module.
Peter
More information about the Python-list
mailing list