107

I use pickle to dump a file on python 3, and I use pickle to load the file on python 2, the ValueError appears.

So, python 2 pickle can not load the file dumped by python 3 pickle?

If I want it? How to do?

1

2 Answers 2

167

You should write the pickled data with a lower protocol number in Python 3. Python 3 introduced a new protocol with the number 3 (and uses it as default), so switch back to a value of 2 which can be read by Python 2.

Check the protocolparameter in pickle.dump. Your resulting code will look like this.

pickle.dump(your_object, your_file, protocol=2)

There is no protocolparameter in pickle.load because pickle can determine the protocol from the file.

57

Pickle uses different protocols to convert your data to a binary stream.

You must specify in python 3 a protocol lower than 3 in order to be able to load the data in python 2. You can specify the protocol parameter when invoking pickle.dump.

2
  • 14
    Just for future reference, apparently there's a protocol 5 that was introduced in Python 3.8 as well which is not compatible with earlier versions. Commented Mar 20, 2020 at 18:12
  • re: protocol 5 python.org/dev/peps/pep-0574 Commented Aug 7, 2020 at 18:16

Not the answer you're looking for? Browse other questions tagged or ask your own question.