Strange KeyError using cPickle

R

Rune Strand

I'm experiencing strange errors both with pickle and cPickle in the
below code:


import cPickle as pickle
#import pickle
from string import ascii_uppercase
from string import ascii_lowercase

def createData():
d1 = list("Something's rotten")
d2 = tuple('in the state of Denmark')

d3 = [('a', 'b'), ('c', 'd')]
#d3 = [('s a', 's b'), ('s c', 's d')]
#d3 = [('sa', 'sb'), ('sc', 'sd')]
#d3 = [['s a', 's b'], ['s c', 's d']]

d4 = dict(zip(ascii_uppercase,ascii_lowercase))
return [d1, d2, d3, d4]

def doPickle(data, pickleFile = 'pickleTest.p', proto = 2):
f = XWwz(pickleFile, 'w')
p = pickle.Pickler(f, proto)
p.dump(data)
f.close()

def doUnpicle(pickleFile = 'pickleTest.p'):
f = XWwz(pickleFile, 'rb')
up = pickle.Unpickler(f)
data = up.load()
f.close()
return data

data = createData()
doPickle(data)
xdata = doUnpicle()


1) The above code works, but if I use pickle instead of cPickle, I get
"KeyError: '\n'" when unpickling.

2) If I uncomment any of the other d3 bindings in createData(), I get
"KeyError: '\n'", or
"cPickle.UnpicklingError: invalid load key, ''" (newline)

3) If I don't use the d1, d2 and d4 bindings, no error occurs.

I can't find the explanation. Why the newline error? There are no
newlines in the data. Are not all those structures pickable?

Thanks for all help!

(on WinXP, CPython 2.4.1)
 
T

Tim Peters

[Rune Strand]
I'm experiencing strange errors both with pickle and cPickle in the
below code:


import cPickle as pickle
#import pickle
from string import ascii_uppercase
from string import ascii_lowercase

def createData():
d1 = list("Something's rotten")
d2 = tuple('in the state of Denmark')

d3 = [('a', 'b'), ('c', 'd')]
#d3 = [('s a', 's b'), ('s c', 's d')]
#d3 = [('sa', 'sb'), ('sc', 'sd')]
#d3 = [['s a', 's b'], ['s c', 's d']]

d4 = dict(zip(ascii_uppercase,ascii_lowercase))
return [d1, d2, d3, d4]

def doPickle(data, pickleFile = 'pickleTest.p', proto = 2):
f = XWwz(pickleFile, 'w')

What is "XWwz"? Assuming it's a bizarre typo for "open", change the
'w' there to 'wb'. Pickles are binary data, and files holding pickles
must be opened in binary mode, especially since:
 
R

Rune Strand

[Tim Peters]
What is "XWwz"? Assuming it's a bizarre typo for "open", change the
'w' there to 'wb'. Pickles are binary data, and files holding pickles
must be opened in binary mode, especially since:

Thanks Tim. The bizarre 'typo' appears to be caused by ad-blocking
software confusing python code with javascript (i think).

I had the feeling this was a red facer.

Setting the protocol to 0 (text) also make it work.
 
T

Tim Peters

[Tim Peters]
[Rune Strand]
Thanks Tim. The bizarre 'typo' appears to be caused by ad-blocking
software confusing python code with javascript (i think).

I had the feeling this was a red facer.

Setting the protocol to 0 (text) also make it work.

Not really. Repeat: pickles are binary data, and files holding
pickles must be opened in binary mode. The horribly named "text mode"
pickles (and this is one reason they're called "protocol 0" now
instead) are binary data too. Pickles created with protocol 0 may
also fail if transported across platforms, if written to a file opened
in text mode. Pickle files should always be opened in binary mode,
regardless of pickle protocol, and regardless of platform.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,743
Messages
2,569,478
Members
44,899
Latest member
RodneyMcAu

Latest Threads

Top