Python pickle Anrufe cPickle?
Ich bin neu in Python. Ich bin eine Anpassung fremder code von Python 2.X zu 3.5. Der code lädt eine Datei über cPickle. Ich änderte alle "cPickle" Vorgänge "Gurke", wie ich verstehe, Gurke abgelöst cPickle in 3.5. Ich bekomme diese Ausführung Fehler:
NameError: name 'cPickle' is not defined
Relevante code:
import pickle
import gzip
...
def load_data():
f = gzip.open('../data/mnist.pkl.gz', 'rb')
training_data, validation_data, test_data = pickle.load(f, fix_imports=True)
f.close()
return (training_data, validation_data, test_data)
Tritt der Fehler in der pickle.load
Linie, wenn load_data()
ist durch eine andere Funktion. Aber a) weder cPickle
oder cpickle
erscheinen nicht mehr in alle source-files irgendwo im Projekt (gesucht weltweit) und b) der Fehler tritt nicht auf, wenn ich die Zeilen innerhalb load_data()
individuell in der Python-shell (jedoch, ich bekomme ein anderes Daten-format-Fehler). Ist pickle
aufrufen cPickle
, und wenn ja, wie verhindere ich es?
Shell:
Python-3.5.0 |Anaconda 2.4.0 (x86_64)| (default, Oct 20 2015, 14:39:26)
[GCC 4.2.1 (Apple Inc. build 5577)] on darwin
IDE: IntelliJ 15.0.1 -, Python-3.5.0, anaconda
Unklar, wie es weitergehen soll. Jede Hilfe zu schätzen. Danke.
- Überprüfen Sie für
.pyc
Dateien und entfernen Sie Sie. Sie könnte veraltet sein.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es sah aus wie die eingelegten Daten, die Sie versuchen zu laden, wurde erzeugt, indem man eine version des Programms, das ausgeführt wurde, auf Python 2.7. Den Daten ist, was enthält die Verweise auf
cPickle
.Das problem ist, dass die Gurke, als ein Serialisierungs-format, vorausgesetzt, dass Ihre standard-Bibliothek (und in geringerem Maße auch des Codes) nicht ändern-layout zwischen Serialisierung und Deserialisierung. Die es getan haben -- viel -- zwischen Python 2 und 3. Und wenn das passiert, Gurke hat keinen Pfad für die migration.
Haben Sie Zugang zu dem Programm, das generiert
mnist.pkl.gz
? Wenn dem so ist, ist die Portierung auf Python 3 und starten Sie es erneut, um zu regenerieren, ein Python-3-kompatible version der Datei.Wenn nicht, werden Sie zu schreiben, ein Python-2-Programm lädt die Datei und exportiert Sie in ein format, das geladen werden kann von Python 3 (abhängig von der Form Ihrer Daten, JSON-und CSV-sind beliebte Wahl), dann schreiben Sie ein Python-3-Programm, lädt das format dann gibt es da Python 3 Gurke. Sie können dann laden Sie das Pickle-Datei von Ihrem ursprünglichen Programm.
Natürlich, was sollten Sie wirklich tun ist, stoppen Sie an der Stelle, wo Sie die Möglichkeit haben, das laden der exportierten format von Python 3 -- und verwenden Sie die oben genannten format wie Ihre tatsächliche, langfristige Speicherung-format.
Verwenden Gurke für etwas anderes als Kurzfristige Serialisierung zwischen vertrauenswürdigen Programme (be-Gurke ist äquivalent zum ausführen von beliebigem code in Ihre Python-VM) ist etwas, sollten Sie aktiv zu vermeiden, unter anderem weil der genaue Fall finden Sie sich in.
cPickle
mehr. Verwenden Sie einfachimport pickle
(oder besser noch nicht mit Gurke, es ist immer noch eine langsame, unsichere, bad Serialisierung-format -- versuchen JSON statt).Eigentlich, wenn Sie gebeizt Objekte aus
python2.x
, dann in der Regel gelesen werden kannpython3.x
. Auch, wenn Sie gebeizt Objekte auspython3.x
Sie in der Regel gelesen werden kannpython2.x
, aber nur, wenn Sie weggeworfen wurden mit einemprotocol
eingestellt2
oder weniger.Auch, wenn Sie auf der Suche für
cPickle
es jetzt_pickle
, nichtpickle
.Sie auch gefragt, wie zu stoppen
pickle
von der Nutzung der built-in (C++) version. Sie können dies tun, indem_dump
und_load
oder die_Pickler
Klasse, wenn Sie gern arbeiten, Objekte der Klasse. Verwirrt? Die altencPickle
ist jetzt_pickle
jedochdump
,load
,dumps
, undloads
alle auf_pickle
... während_dump
,_load
,_dumps
, und_loads
Punkt auf die Reine python-version. Zum Beispiel:So, wenn Sie nicht wollen, verwenden Sie die built-in version, dann können Sie
pickle._loads
und dergleichen.In Anaconda Python Ist3.5 :
man kann auf cPickle als
credits zu Mike McKerns
Dies umgeht die technischen Fragen, es könnte sein, py3 version der Datei mit dem Namen mnist_py3k.pkl.gz Wenn ja, versuchen Sie, öffnen der Datei statt.