TypeError: se requiere un objeto similar a bytes, no ‘str’ al abrir el archivo Python 2 Pickle en Python 3

Estoy tratando de abrir un archivo pickle en Python 3 con el código que funcionó en Python 2 pero ahora me está dando un error. Aquí está el código:

with open(file, 'r') as f: d = pickle.load(f) TypeError Traceback (most recent call last)  in () 1 with open(file, 'r') as f: ----> 2 d = pickle.load(f) TypeError: a bytes-like object is required, not 'str' 

Vi en otras respuestas de SO que la gente tenía este problema al usar open(file ,'rb') y cambiar a open(file ,'r') solucionó. Si esto ayuda, intenté open(file ,'rb') solo para experimentar y obtuve el siguiente error:

 UnpicklingError Traceback (most recent call last)  in () 1 with open(file, 'rb') as f: ----> 2 d = pickle.load(f) UnpicklingError: invalid load key, '\x0a'. 

Cuando abro el archivo con f = open(file, 'r') y el ingreso f recibo:

  

Así que también intenté:

 with open(file, 'rb') as f: d = pickle.load(f, encoding='cp1252') 

y obtuvo el mismo error que con el uso de ‘rb’:

     UnpicklingError Traceback (most recent call last)  in () 1 with open(file, 'rb') as f: ----> 2 d = pickle.load(f, encoding='cp1252') UnpicklingError: invalid load key, '\x0a'. 

    Explicación para la carga con encoding = bytes.

    Supongamos que tiene un diccionario para ser decapado en Python2

     data_dict= {'key1': value1, 'key2': value2} with open('pickledObj.pkl', 'wb') as outfile: pickle.dump(data_dict, outfile) 

    Descomprimido en Python3

     with open('pickledObj.pkl', 'rb') as f: data_dict = pickle.load(f, encoding='bytes') 

    Nota: Las claves del diccionario ya no son cadenas. Son bytes.

     data_dict['key1'] #result in KeyError data_dict[b'key1'] #gives value1 

    o usar

     data_dict['key1'.encode('utf-8')] #gives value1 

    Sí, hay algunos cambios entre los formatos de pickle Python 2 y 3. Si es posible, recomiendo volver a crear los datos decapados usando Python 3.

    Si eso no es posible / fácil, intente jugar con diferentes configuraciones de encoding (¿ 'utf8' ?) O lea los datos con encoding='bytes' como se menciona aquí y luego decodifique las cadenas en su código donde puede inspeccionar el objeto promover.

    Después de revisar el archivo sin procesar en Sublime, parece que el archivo no se ha decapado correctamente. El código anterior funciona perfectamente en una versión diferente de ese archivo.