LoginSignup
2
1

More than 5 years have passed since last update.

Python3で作られたpickleファイルをPython2で読み込みたい

Posted at

はじめに

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

参考URL

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1