Unpickling un python 2 objet avec python 3
Je me demandais si il existe un moyen de charger un objet qui a été mariné dans Python 2.4, avec Python 3.4.
J'ai été en cours d'exécution 2to3 sur un grand nombre d'entreprise legacy code pour l'obtenir jusqu'à ce jour.
Ayant fait cela, lorsque vous exécutez le fichier j'obtiens l'erreur suivante:
File "H:\fixers - 3.4\addressfixer - 3.4\trunk\lib\address\address_generic.py"
, line 382, in read_ref_files
d = pickle.load(open(mshelffile, 'rb'))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 1: ordinal
not in range(128)
À la recherche à la mariné objet en lice, c'est un dict
dans un dict
, contenant des clés et des valeurs de type str
.
Donc ma question est: Est-il un moyen de charger un objet, à l'origine, marinés dans python 2.4, avec python 3.4?
- Python 2.4 ont la
json
module? Peut-être que vous pourriez écrire un 2.4 script qui unpickles l'objet et l'enregistre comme un objet json, puis d'écrire un 3.4 script qui lit l'objet json et l'enregistre comme un 3,4-compatible pickle objet. Ce serait une opération unique que vous exécutez sur l'ensemble de vos cornichons fichiers. - Je pensais le long des lignes similaires, étant donné que ce sont dicts je pense que je pourrais juste changer sys.stdout vers un fichier et de les imprimer, mais je veux voir si je peux les charger en premier
- Liés à la question d'avoir à faire avec datetimes en particulier: stackoverflow.com/questions/24805105/...
Vous devez vous connecter pour publier un commentaire.
Vous aurez à dire
pickle.load()
comment convertir Python bytestring données à Python 3 cordes, ou vous pouvez direpickle
de les laisser comme des octets.La valeur par défaut est d'essayer de décoder toutes les données de chaîne ASCII, et que le décodage échoue. Voir la
pickle.load()
de la documentation:Réglage de l'encodage à
latin1
vous permet d'importer les données directement:mais vous aurez besoin de vérifier qu'aucun de vos chaînes sont décodés à l'aide de la mauvaise codec; Latin-1 fonctionne pour n'importe quelle entrée comme les cartes de l'octet valeurs de 0 à 255 pour la première 256 Unicode codepoints directement.
L'alternative consisterait à charger les données avec
encoding='bytes'
, et de décoder tous lesbytes
des clés et des valeurs par la suite.Noter que pour les versions de Python avant 3.6.8, 3.7.2 et 3.8.0, unpickling de Python 2
datetime
de l'objet de données est cassé sauf si vous utilisezencoding='bytes'
.encoding
mot-clé le tout pour Python 2.'encoding': 'latin1'
et envoyer **pickle_options de cornichon. De cette façon, il devrait fonctionner dans les deux versions.datetime
commentaire n'était pas l'objectif principal de cette réponse, mais pour les futurs lecteurs, je tiens à souligner que même le "fixe" versions de Python 3 nécessitent encoreencoding='latin-1'
à unpickle Python 2 datetimes. Si votre marinés Python 2 données qui se passe à inclure à la fois datetimes et bytestrings codé en quelque chose d'autre que Latin-1, alors vous avez peut-être encore mieux de les utiliserencoding='bytes'
après tout.À l'aide de encoding = 'latin1' causes des problèmes lors de votre objet contient des tableaux numpy en elle.
En utilisant l'encodage = octets sera mieux.
Veuillez voir cette réponse pour une explication complète de l'utilisation de encoding=octets