He decapado archivos usando el protocolo 3 en python3, y ahora necesito deshacerlos con python2, ¿qué puedo hacer?

mydata = pickle.load(myfile, "rb") ValueError: unsupported pickle protocol: 3 

Esto está relacionado con: ValueError: protocolo de pickle no admitido: 3, python2 pickle no puede cargar el archivo volcado por python 3 pickle?

Así que claramente, con previsión, debe establecer el protocol=2 cuando descargue su archivo pickle en python3 si desea poder deshacerlo con python2.

Sin embargo, ¿qué sucede si, por desgracia, te quedas atascado con los archivos que se decaparon en python 3 utilizando el protocolo 3 y ahora debes leerlos con python2? ¿Hay algún trabajo alrededor?

Hay una pregunta relacionada, pero parece ser un problema central diferente: desmarcar OrderedDict de python3 en python2

Si no tiene control sobre la forma en que se crearon estos archivos encurtidos, y debe cargarlos en Python 2.7, desafortunadamente no hay una solución fácil.

Quizás la persona que creó los archivos no era consciente del hecho de que el protocolo predeterminado para pickle en Python 3 es “3”, pero que esto es incompatible con versiones anteriores.

De la documentación :

Actualmente el protocolo por defecto es 3; un protocolo incompatible con versiones anteriores diseñado para Python 3.0.

Si son un conjunto fijo de archivos, entonces una solución puede ser simplemente escribir un script que carga de forma iterativa los archivos encurtidos del protocolo 3 en Python 3.0 y luego reescribirlos usando protocol=2 como solución de un solo disparo. Entonces podrás leerlos en Python 2.7. Asegúrese también de que el código original que escribe estos archivos se modifique si hay futuros archivos que se crearán y que su código deberá manejar.

@Kay señala lo sencilla que es esta solución en la práctica: he seleccionado los archivos utilizando el protocolo 3 en python3, y ahora necesito deshacerlos con python2, ¿qué puedo hacer?

Tan fácil como pickle.dump (pickle.load (sys.stdin), sys.stdout, 2)

El enfoque más simple y sencillo será escribir un script de Python3 que se deshaga de todo utilizando el protocolo 3 y lo reproduzca de nuevo utilizando el protocolo 2. (Considere cambiar a camello al mismo tiempo).

En Python 3:

 pickle.dump(pickle.load(sys.stdin), sys.stdout, 2) 

Luego en Python 2:

 pickle.load(...) # This will work now in Python 2.