Diverses spécifications sont répertoriées: http://docs.python.jp/3.4/library/pickle.html
Un peu après être passé au 3ème système, je voulais lire les données sauvegardées par le pickle
précédemment créé, mais une erreur s'est produite.
pickle-load-error.
# test_w_2.pkl est un système 2[1]Fichier de vidage
In [25]: fin = open('test_w_2.pkl', 'r')
In [26]: pickle.load(fin)
TypeError: a bytes-like object is required, not 'str'
J'obtiens une erreur comme celle-ci, n'est-ce pas str? Il semble que je dois faire des octets
Il semble que vous devriez ajouter'rb 'à l'option au moment de ʻopen` (mode binaire)
piclkle-load.
In [38]: fin = open('test_wb_2.pkl', 'rb')
In [39]: pickle.load(fin)
Out[39]: [1]
Dans l'exemple ci-dessus, seul «[1]» a été vidé.
Il semble qu'il ne soit pas possible de charger si la liste contient une chaîne de caractères.
Lorsque vous faites pickle.load
, changez la méthode d'encodage avec ʻencoding = 'bytes'. Il est nécessaire de convertir le contenu de la
liste reçue en chaîne en utilisant
.decode ('utf8')`.
python2.7.9
pickle.dump
>>> pickle.dump(['AIUEO'], open('test.pkl', 'w') )
python3.5.0
pickle.load
#Lire normalement et erreur
>>> pickle.load(open('test.pkl', 'r') )
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: a bytes-like object is required, not 'str'
#Même si vous le lisez en binaire'ascii'Erreur car elle ne correspond pas à
>>> pickle.load(open('test.pkl', 'rb') )
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 0: ordinal not in range(128)
#Je pourrais le lire après avoir changé la méthode de codage, mais je ne peux pas le lire en octets.
>>> pickle.load(open('test.pkl', 'rb'), encoding='bytes' )
[b'\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a']
# decode('utf8')Utilisez pour décoder chaque élément de la liste
>>> list(map(lambda x: x.decode('utf8'), pickle.load(open('test.pkl', 'rb'), encoding='bytes' ) ) )
['AIUEO']
S'il est normalement fait avec 3 séries (vidage), il ne peut pas être lu (charge) avec 2 séries
Il est écrit dans l'URL que j'ai écrite au début, mais il semble que vous puissiez spécifier protocole
.
Vous trouverez ci-dessous une description de chaque version de protocole
-Le protocole version 0 est le protocole original "lisible par l'homme", qui est rétrocompatible avec les versions antérieures de Python.
Bien sûr, dans la série python2, il n'y a que jusqu'à 2 protocoles
, il semble donc préférable de faire correspondre cela avec python3 également. (Parce que les gens autour de moi n'utilisent pas beaucoup le système python2)
Pour autant que je puisse voir, 4 semble être le meilleur, il semble donc préférable de le spécifier lorsque vous ne l'utilisez que.
À propos, la valeur par défaut est 3.
python3.5
pickle.dump
>>> pickle.dump(['AIUEO'], open('test.pkl','wb'), protocol=2 )
python2.7
pickle.load
>>> pickle.load(open('test.pkl') )
[u'\u3042\u3044\u3046\u3048\u304a']
>>> print(pickle.load(open('test.pkl') )[0] )
AIUEO
Si vous ajoutez "rb", c'est tout à fait le cas (pour l'instant)
Il existe d'autres options pour fix_imports
et ʻerrors`, mais pour l'instant cela fonctionne.
Je l'ajouterai lorsqu'une scène qui ne bouge pas apparaîtra.
Recommended Posts