HOWTO · Python
ValueError: サポートされていない Pickle プロトコル: Python の 3
このチュートリアルでは、ValueError: unsupported pickle protocol: 3、その原因、および Python でこのエラーを解決する方法を示します。
このページの内容
どのプログラミング言語でも、多くのエラーが発生します。 コンパイル時に発生するものもあれば、実行時に発生するものもあります。
この記事では、ValueError: サポートされていない pickle プロトコル: 3 について説明します。
Python での酸洗いと酸洗い解除
Pickling は、Python のオブジェクト (list や dict など) を文字列にするメソッドです。 この文字ストリームには、Unpicklingと呼ばれる逆のプロセスを使用して別の Python スクリプトでオブジェクトを再作成するために必要なすべてのデータが含まれているはずです。
pickle モジュールは、Python で酸洗いと酸洗解除を行います。
次のコードでは、リストを pickle 化および unpickle しました。 名前のリストを作成し、wb モードを使用してファイルを開きました。
w はファイルがまだ存在しない場合はファイルを作成し、b はデータ (リスト) をバイトストリームでファイルに書き込みます。 ダンプするリストとデータをバイト形式で書き込むファイル名を指定して dump() メソッドを呼び出しました。
同様に、最初に rb モードでファイルからデータを読み取って、データのピクルを解除しました。 load() メソッドを使用して、ファイルからバイトを読み取り、リスト オブジェクトに変換し直しました。
コード例:
# Python 3.x
import pickle
my_list = ["Jhon", "Alia", "Sam", "Chris"]
with open("my_file.txt", "wb") as f:
pickle.dump(my_list, f)
my_file = open("my_file.txt", "rb")
data = pickle.load(my_file)
print(data)
出力 (Anaconda の Jupyter Notebook で実行):
Python での ValueError: unsupported pickle protocol: 3 の原因
unpickle の過程で、ValueError: unsupported pickle protocol: 3 に直面することがあります。 これは、データの pickle 化および unpickle 中に使用される pickle プロトコルに互換性がないためです。
Python 3 では、プロトコルを指定しない場合にデータをピクルおよびアンピクルするために、デフォルトでプロトコル 3 が導入および使用されました。 異なるプロトコルを使用してデータをピクルおよびアンピクルすると、次のコードに示すように、このエラーが発生します。
Python 2 はデフォルトでプロトコル 0 を使用し、Python 3 はプロトコル 3 を使用しました。したがって、このエラーは、プロトコル バージョンを正しく指定せずに異なる Python バージョンでデータを pickle および unpickle するときに主に直面します。
コード例:
パイソン 3:
# Python 3.x
import pickle
my_list = ["Jhon", "Alia", "Sam", "Chris"]
with open("my_file.txt", "wb") as f:
pickle.dump(my_list, f)
パイソン 2:
# Python 2.x
import pickle
my_file = open("my_file.txt", "rb")
data = pickle.load(my_file)
print(data)
出力:
Python の ValueError: unsupported pickle protocol: 3 を修正
このエラーを解決するには、Python 3 を使用してデータをダンプしてこのデータを Python 2 にロードするときに、ピクル プロトコルを 3 未満に指定する必要があります。Python 2 は 2 を超えるプロトコルをサポートしていないためです。
コード例:
# Python 3.x
import pickle
my_list = ["Jhon", "Alia", "Sam", "Chris"]
with open("my_file.txt", "wb") as f:
pickle.dump(my_list, f, protocol=2)
コード例:
# Python 2.x
import pickle
my_file = open("my_file.txt", "rb")
data = pickle.load(my_file)
print(data)
出力:
ここで、文字列の前の u は Unicode を表します。