Verschiedene Spezifikationen sind aufgeführt: http://docs.python.jp/3.4/library/pickle.html
Kurz nach dem Wechsel zum 3. System wollte ich die Daten lesen, die von der vorherigen "Pickle" ausgegeben wurden, aber es trat ein Fehler auf.
pickle-load-error.
# test_w_2.pkl ist 2 System[1]Dump-Datei
In [25]: fin = open('test_w_2.pkl', 'r')
In [26]: pickle.load(fin)
TypeError: a bytes-like object is required, not 'str'
Ich bekomme so einen Fehler, nicht wahr? Es scheint, dass ich es Bytes machen muss
Es scheint, dass Sie der Option zum Zeitpunkt von "Öffnen" (Binärmodus) "rb" hinzufügen sollten.
piclkle-load.
In [38]: fin = open('test_wb_2.pkl', 'rb')
In [39]: pickle.load(fin)
Out[39]: [1]
Im obigen Beispiel wurde nur "[1]" ausgegeben. Es scheint, dass das Laden möglicherweise nicht möglich ist, wenn die Liste eine Zeichenfolge enthält. Wenn Sie "pickle.load" ausführen, ändern Sie die Codierungsmethode mit "encoding =" bytes ". Es ist notwendig, den Inhalt der empfangenen "Liste" mit ".decode (" utf8 ")" in einen String zu konvertieren.
python2.7.9
pickle.dump
>>> pickle.dump(['AIUEO'], open('test.pkl', 'w') )
python3.5.0
pickle.load
#Normal lesen und Fehler
>>> 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'
#Auch wenn Sie es binär lesen'ascii'Fehler, weil es nicht entspricht
>>> 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)
#Ich konnte es nach dem Ändern der Codierungsmethode lesen, aber ich kann es nicht als Bytes lesen.
>>> 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')Verwenden Sie diese Option, um jedes Element in der Liste zu dekodieren
>>> list(map(lambda x: x.decode('utf8'), pickle.load(open('test.pkl', 'rb'), encoding='bytes' ) ) )
['AIUEO']
Wenn es normalerweise mit 3 Serien (Dump) erstellt wird, kann es mit 2 Serien nicht gelesen (geladen) werden Es ist in der URL geschrieben, die ich am Anfang geschrieben habe, aber es scheint, dass Sie "Protokoll" angeben können. Unten finden Sie eine Beschreibung jeder Protokollversion
-Protokoll Version 0 ist das ursprüngliche "lesbare" Protokoll, das mit früheren Versionen von Python abwärtskompatibel ist. --Protokoll Version 1 ist ein älteres Binärformat, das auch mit früheren Versionen von Python kompatibel ist. --Protokoll Version 2 wurde in Python 2.3 eingeführt. Diese Version bietet eine effizientere Auswahl der neuen Klassenmethode. In PEP 307 finden Sie Informationen zu Verbesserungen, die mit Protokoll 2 vorgenommen wurden. --Protokoll Version 3 wurde in Python 3.0 hinzugefügt. Diese Version unterstützt Byte-Objekte. In Python 2.x darf es nicht ohne Beizen sein. Dies ist das Standardprotokoll und das empfohlene Protokoll, wenn Kompatibilität mit anderen Python 3-Versionen erforderlich ist. --Protokoll Version 4 wurde in Python 3.4 hinzugefügt. Diese Version bietet Unterstützung für große Objekte, Auswahl für weitere Objekttypen und Optimierungen für einige Datenformate. In PEP 3154 finden Sie Informationen zu Verbesserungen, die mit Protokoll 4 vorgenommen wurden.
Natürlich gibt es in der Python2-Serie nur bis zu 2 Protokolle, daher scheint es besser, dies auch mit Python3 abzugleichen. (Weil die Leute um mich herum das Python2-System nicht sehr oft benutzen) Soweit ich sehen kann, scheint 4 das Beste zu sein, daher scheint es besser, dies anzugeben, wenn nur Sie es verwenden. Der Standardwert ist übrigens 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
Wenn Sie 'rb' hinzufügen, ist es (vorerst) ganz so. Es gibt andere Optionen für "fix_imports" und "error", aber im Moment funktioniert es. Ich werde es hinzufügen, wenn eine Szene erscheint, die sich nicht bewegt.
Recommended Posts