はじめに
Python3でプロトコルを指定せずに作られたpickleを、Python2で読み込もうとすると、以下のエラーが出ることがあります。
プロトコルについては、後述します。
ValueError: unsupported pickle protocol: 3
解決法
Python3で読み込んで、Python2で読み込める形式で保存します。pickle.dump()
内で、protocol=2
と指定します。
#!/usr/bin/env python3
import pickle
with open("sample_py3.pkl", "rb") as f:
w = pickle.load(f)
pickle.dump(w, open("sample_py2.pkl","wb"), protocol=2)
この例ですと、sample_py2.pkl
をPython2で読み込むことができます。
読み込める形式とは
Pickleは、データをバイナリストリームに変換するためにプロトコルを使用します。
0〜HIGHEST_PROTOCOL(執筆時、2019/02/25では4)まであります。
- Python2では、3つの異なるプロトコル(0, 1, 2)を使うことができ、デフォルトは0です。
- Python3では、5つの異なるプロトコル(0, 1, 2, 3, 4)を使うことができ、デフォルトは3です。
Python2ではプロトコル3以上を選択できないので、Python2で、プロトコルが3以上のpickleを読み込みたい場合は、Python3で一旦読み込んでから、プロトコル2以下を指定して保存する必要があるということです。
各プロトコルバージョンについては、以下をご覧ください。
https://docs.python.jp/3/library/pickle.html#pickle-protocols