By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
445,758 Members | 1,223 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 445,758 IT Pros & Developers. It's quick & easy.

Strange KeyError using cPickle

P: n/a
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)

Jul 19 '05 #1
Share this Question
Share on Google+
3 Replies


P: n/a
[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:
...
(on WinXP, CPython 2.4.1)

Jul 19 '05 #2

P: n/a
[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:
...
(on WinXP, CPython 2.4.1)


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.

Jul 19 '05 #3

P: n/a
[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:
...
(on WinXP, CPython 2.4.1)

[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.
Jul 19 '05 #4

This discussion thread is closed

Replies have been disabled for this discussion.