Tendrá que indicar pickle.load()
cómo convertir los datos de la cadena de bytes de Python en cadenas de Python 3, o puede indicar pickle
que los deje como bytes.
El valor predeterminado es intentar decodificar todos los datos de cadena como ASCII, y esa decodificación falla. Ver la pickle.load()
documentación :
Los argumentos opcionales de palabras clave son fix_imports , codificación y errores , que se utilizan para controlar el soporte de compatibilidad para el flujo de pickle generado por Python 2. Si fix_imports es verdadero, pickle intentará asignar los nombres antiguos de Python 2 a los nuevos nombres utilizados en Python 3. El la codificación y los errores le indican a pickle cómo decodificar instancias de cadena de 8 bits encurtidas por Python 2; estos predeterminados a 'ASCII' y 'estricto', respectivamente. La codificación puede ser 'bytes' para leer estas instancias de cadena de 8 bits como objetos de bytes.
Configurar la codificación le latin1
permite importar los datos directamente:
with open(mshelffile, 'rb') as f:
d = pickle.load(f, encoding='latin1')
pero deberá verificar que ninguna de sus cadenas esté decodificada usando el códec incorrecto; Latin-1 funciona para cualquier entrada ya que asigna los valores de byte 0-255 a los primeros 256 puntos de código Unicode directamente.
La alternativa sería cargar los datos con encoding='bytes'
, y decodificar todas las bytes
claves y valores después.
Tenga en cuenta que hasta las versiones de Python anteriores a 3.6.8, 3.7.2 y 3.8.0, el desbloqueo de los datetime
datos del objeto Python 2 está roto a menos que lo use encoding='bytes'
.
json
módulo? Tal vez podría escribir un script 2.4 que desenrede el objeto y lo guarde como un objeto json, y luego escribir un script 3.4 que lea el objeto json y lo guarde como un objeto pickle compatible con 3.4. Esta sería una operación de una sola vez que ejecuta en todos sus archivos pickle.