ValueError: protocole pickle non pris en charge: 3, pickle python2 ne peut pas charger le fichier sauvegardé par pickle python 3?

101

J'utilise pickle pour vider un fichier sur python 3, et j'utilise pickle pour charger le fichier sur python 2, le ValueError apparaît.

Donc, python 2 pickle ne peut pas charger le fichier vidé par python 3 pickle?

Si je le veux? Comment faire?

Aleeee
la source
5
Si vous êtes coincé avec des fichiers marinés déjà écrits, consultez: stackoverflow.com/questions/34571063/…
rysqui

Réponses:

158

Vous devriez écrire les données décapées avec un numéro de protocole inférieur en Python 3. Python 3 a introduit un nouveau protocole avec le numéro 3(et l'utilise par défaut), donc revenez à une valeur 2qui peut être lue par Python 2.

Vérifiez le protocolparamètre dans pickle.dump. Votre code résultant ressemblera à ceci.

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

Il n'y a pas de protocolparamètre pickle.loadcar picklepeut déterminer le protocole à partir du fichier.

Matthias
la source
54

Pickle utilise différents protocolspour convertir vos données en un flux binaire.

Vous devez spécifier en python 3 un protocole inférieur 3à pour pouvoir charger les données en python 2. Vous pouvez spécifier le protocolparamètre lors de l'appel pickle.dump.

enrico.bacis
la source
10
Juste pour référence future, il existe apparemment un protocole 5qui a également été introduit dans Python 3.8 qui n'est pas compatible avec les versions antérieures.
Farzad Abdolhosseini
re: protocol 5 python.org/dev/peps/pep-0574
Caleb Syring