[Tutor] BadPickleGet error

2011-06-25 Thread Rick Pasotto
Traceback (most recent call last):
  File /usr/share/rss2email/rss2email.py, line 748, in module
else: run()
  File /usr/share/rss2email/rss2email.py, line 488, in run
feeds, feedfileObject = load()
  File /usr/share/rss2email/rss2email.py, line 439, in load
feeds = pickle.load(feedfileObject)
cPickle.BadPickleGet: 2574'8

Could someone please explain what the number(s) after 'BadPickleGet'
mean?

I assume the data file is corrupt but the question is can I fix it with
an editor using that info?

-- 
We pay the debts of the last generation by issuing bonds payable
 by the next generation. -- Lawerence J.Peter
Rick Pasottor...@niof.nethttp://www.niof.net
___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] BadPickleGet error

2011-06-25 Thread Peter Otten
Rick Pasotto wrote:

 Traceback (most recent call last):
   File /usr/share/rss2email/rss2email.py, line 748, in module
 else: run()
   File /usr/share/rss2email/rss2email.py, line 488, in run
 feeds, feedfileObject = load()
   File /usr/share/rss2email/rss2email.py, line 439, in load
 feeds = pickle.load(feedfileObject)
 cPickle.BadPickleGet: 2574'8
 
 Could someone please explain what the number(s) after 'BadPickleGet'
 mean?

It's a key into a dictionary with previously retrieved objects.
When you save the same object in a pickle it is written once, and for the 
second occurence a reference to the previously stored object is written:

 import cPickle
 import pickletools
 data = (alpha, alpha)
 cPickle.dumps(data)
(S'alpha'\np1\ng1\ntp2\n.
 dump = _
 pickletools.dis(dump)
0: (MARK
1: SSTRING 'alpha'
   10: pPUT1
   13: gGET1
   16: tTUPLE  (MARK at 0)
   17: pPUT2
   20: .STOP
highest protocol among opcodes = 0

Now let's break it:

 broken = dump.replace(g1, g2)
 cPickle.loads(broken)
Traceback (most recent call last):
  File stdin, line 1, in module
cPickle.BadPickleGet: 2

 I assume the data file is corrupt but the question is can I fix it with
 an editor using that info?
 
Probably not. You could run your file through pickletools.dis() to find the 
location of the bad key

 pickletools.dis(broken)
0: (MARK
1: SSTRING 'alpha'
   10: pPUT1
   13: gGET2
Traceback (most recent call last):
  File stdin, line 1, in module
  File /usr/lib/python2.6/pickletools.py, line 2006, in dis
raise ValueError(errormsg)
ValueError: memo key 2 has never been stored into

but if you replace it with a valid one your data will still be messed up. 
Also, there are probably other errors in the file.

Another idea, patching the Unpickler implemented in Python to replace bad 
references with a dummy object:

 import pickle
 class U(pickle.Unpickler):
... def my_load_get(self):
... try:
... obj = self.load_get()
... except KeyError:
... obj = object could not be retrieved
... self.append(obj)
... dispatch = pickle.Unpickler.dispatch.copy()
... dispatch[pickle.GET] = my_load_get
...
 from cStringIO import StringIO
 U(StringIO(broken)).load()
('alpha', 'object could not be retrieved')

suffers from the same problems.

___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor