[PYTHON] pickle Um zu lesen, was in 2 Serien mit 3 Serien gemacht wurde

Ich möchte das 2. System pickle.dump und das 3. System pickle.load.

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.

Error

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

Lösungen

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]   

[Addition] Wenn ausgegeben, ist Zeichenfolge

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']  

[Ergänzung] Im Gegenteil, um zu lesen, was in 3 Serien in 2 Serien gemacht wurde

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

Zusammenfassung

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

pickle Um zu lesen, was in 2 Serien mit 3 Serien gemacht wurde
Was ich mit json.dumps in Pythons base64-Codierung süchtig gemacht habe
Lesen von Zeitreihendaten in PyTorch
Ich war süchtig danach, 2020 mit Selen (+ Python) zu kratzen
Was ich getan habe, als ich wütend war, es mit der Option enable-shared einzufügen
Ich habe ein Paket erstellt, um Zeitreihen mit Python zu filtern
Ich habe eine Bibliothek erstellt, die Konfigurationsdateien mit Python einfach lesen kann
Was tun mit der Installation von Magics?
Numer0n mit Elementen, die mit Python erstellt wurden
Ich habe versucht zusammenzufassen, was mit Qiita mit Word Cloud ausgegeben wurde
Was tun mit PYTHON Release?
Lesen Sie Dateien parallel zu Python
Was tun, wenn Sie sich mit FileNotFoundError in der Dateireferenz verlieren?
Mit Docker durchgeführte Umgebungswartung (Ich möchte GrADS in Python nachbearbeiten
Was tun, wenn Sie nicht mit pip in einer Babun-Umgebung installieren können?
Laden Sie das, was Sie angefordert haben, mit AWS Lambda Python in S3 hoch
Was tun, wenn die Python-Version in Cloud 9 von einer anderen Person erstellt wurde?
Versuchen Sie, sich mit Python bei qiita anzumelden
So arbeiten Sie mit BigQuery in Python
So betreiben Sie die Zeitstempelstation in Python
Was ich süchtig nach Python Autorun war
Lesen von CSV-Dateien mit Pandas
Hinzufügen von Serien zur Spalte in Python-Pandas
Wie man Problemdaten mit Paiza liest
Lesen von Zeichen in Bildern mit Python OCR
Bücher über Datenwissenschaft, die 2020 gelesen werden sollen
Wovon ich beim Erstellen von Webanwendungen in einer Windows-Umgebung abhängig war
Eine Geschichte, der ich nach der SFTP-Kommunikation mit Python verfallen war
Bequeme Zeitreihenaggregation mit TimeGrouper von Pandas
Umgang mit Speicherlecks in matplotlib.pyplot
Bis du weißt, was du mit Django mit Jenkins gemacht hast
Lesen einer CSV-Datei mit Python 2/3
Melden Sie sich mit SSH bei einem Remote-Server an
[REAPER] Wie man Reascript mit Python spielt
Was tun, wenn pipreqs zu UnicodeDecodeError führt?
Konvertieren Sie PDFs mit Python in Massenbilder
Python: Ich konnte in Lambda rekursieren
Zusammenfassung dessen, was bei 100 Pandas-Schlägen verwendet wurde (# 1 ~ # 32)
Verwendung der Python-Bildbibliothek in der Python3-Serie
Ich habe versucht, Keras in TFv1.1 zu integrieren
[Python] Wie man Excel-Dateien mit Pandas liest
Ich kann nicht nerven. Wie man mit nervigen Objekten umgeht
Lesen Sie Tabellendaten in einer PDF-Datei mit Python
Umgang mit Laufzeitfehlern in subprocess.call
Lesen Sie "Quantencomputer hergestellt in 14 Tagen". Dritter Tag
Konvertieren Sie UTF-8-CSV-Dateien in Excel
Melden Sie sich mit Selenium Python bei Yahoo Business an
Melden Sie sich einfach mit mehreren Konten bei AWS an
Wie man tkinter mit Python in Pyenv benutzt
Speichern Sie das Objekt in einer Datei mit pickle
Lesen Sie "Quantencomputer hergestellt in 14 Tagen". Erster Tag
Was soll ich mit DICOM von MPEG2 machen?
Was tun, um eine Google-Tabelle in Python zu erhalten?
So lesen Sie Dateien in verschiedenen Verzeichnissen
Materialien zum Lesen, wenn Sie mit Python beginnen
Wovon ich süchtig war, als ich Klassenvererbung und gemeinsame Tabellenvererbung in SQLAlchemy kombinierte
Lesen und Schreiben durch Komprimieren von Variablen wie DataFrame mit joblib anstelle von pickle
Was tun, wenn Sie Python auf IntelliJ ausführen und mit einem Fehler beenden?