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 
> 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 "", line 1, in 
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 "", line 1, in 
  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 = ""
... self.append(obj)
... dispatch = pickle.Unpickler.dispatch.copy()
... dispatch[pickle.GET] = my_load_get
...
>>> from cStringIO import StringIO
>>> U(StringIO(broken)).load()
('alpha', '')

suffers from the same problems.

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


[Tutor] BadPickleGet error

2011-06-25 Thread Rick Pasotto
Traceback (most recent call last):
  File "/usr/share/rss2email/rss2email.py", line 748, in 
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