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?


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.


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.


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.