Python-Serialisierung - Warum Gurke?

86

Ich habe verstanden, dass Python-Beizen eine Möglichkeit ist, ein Python-Objekt so zu speichern, dass die Objektprogrammierung berücksichtigt wird - anders als bei einer Ausgabe, die in eine txt-Datei oder eine DB geschrieben wurde.

Haben Sie weitere Details oder Referenzen zu folgenden Punkten:

  • Wo werden eingelegte Gegenstände "gelagert"?
  • Warum ist das Beibehalten der Objektdarstellung mehr als beispielsweise das Speichern in der Datenbank?
  • Kann ich eingelegte Objekte von einer Python-Shell-Sitzung zu einer anderen abrufen?
  • Haben Sie wichtige Beispiele, wenn die Serialisierung nützlich ist?
  • Bedeutet Serialisierung mit Pickle, dass Daten komprimiert werden?

Mit anderen Worten, ich suche nach einem Dokument zum Beizen - Python.doc erklärt, wie man Beizen implementiert, scheint aber nicht auf Details über die Verwendung und die Notwendigkeit der Serialisierung einzugehen.

kiriloff
quelle
Es wäre meine Vermutung, den Status für eine spätere Wiederherstellung zu speichern oder ein Objekt für eine andere Python-Laufzeit freizugeben / zu kopieren.
Synthesizerpatel
13
Viele Ihrer Fragen werden durch den Wikipedia-Artikel zur Serialisierung beantwortet: en.wikipedia.org/wiki/Serialization
NPE
5
Fragen Sie, warum ich Pickle für die Serialisierung in Python benötige? oder vielmehr, was ist eigentlich der Zweck der Serialisierung? .
Moooeeeep
Vielleicht gut, um die Sicherheitsprobleme mit Gurke zu erwähnen. Beispiele finden Sie in den Dokumenten und in zahlreichen SO-Fragen wie dieser .
DJVG

Antworten:

98

Das Beizen ist eine Möglichkeit, ein Python-Objekt (Liste, Diktat usw.) in einen Zeichenstrom umzuwandeln. Die Idee ist, dass dieser Zeichenstrom alle Informationen enthält, die zum Rekonstruieren des Objekts in einem anderen Python-Skript erforderlich sind.

Wo die eingelegten Informationen gespeichert sind, würde man normalerweise tun:

with open('filename', 'wb') as f:
    var = {1 : 'a' , 2 : 'b'}
    pickle.dump(var, f)

Das würde die eingelegte Version unseres varDiktats in der 'Dateinamen'-Datei speichern. In einem anderen Skript können Sie dann aus dieser Datei in eine Variable laden und das Wörterbuch wird neu erstellt:

with open('filename','rb') as f:
    var = pickle.load(f)

Eine andere Verwendung zum Beizen ist, wenn Sie dieses Wörterbuch über ein Netzwerk übertragen müssen (möglicherweise mit Sockets oder Ähnlichem). Sie müssen es zuerst in einen Zeichenstrom konvertieren und können es dann über eine Socket-Verbindung senden.

Außerdem gibt es hier keine nennenswerte "Komprimierung" ... es ist nur eine Möglichkeit, von einer Darstellung (im RAM) in eine andere (im "Text") zu konvertieren.

About.com hat eine schöne Einführung von Beizen hier .

austin1howard
quelle
2
normalerweise würde man tunwith open('filename') as f: ...
moooeeeep
3
Außerdem müssten Sie dies tun, with open(filename, 'wb') as f: ...oder Sie könnten nicht in die Datei schreiben.
Tim Pietzcker
Vielen Dank!! Dieser auf Python Persistenz - Management ist schön, hier
Kiriloff
1
Im Allgemeinen ist es keine sehr gute Idee, pickleein Wörterbuch über ein Netzwerk zu übertragen (json könnte hier besser sein). In seltenen Fällen kann es jedoch nützlich sein, z multiprocessing. B. ein Modul.
JFS
@ Tim Pietzcker: protocol=0(Standard in Python2.x) kann mit Dateien verwendet werden, die im Textmodus geöffnet sind.
JFS
36

Beizen ist für verteiltes und paralleles Rechnen unbedingt erforderlich.

Angenommen , Sie möchten eine parallele Kartenreduzierung mit multiprocessing(oder über Clusterknoten mit Pyina ) durchführen, dann müssen Sie sicherstellen, dass die Funktion, die Sie über die parallelen Ressourcen hinweg zuordnen möchten , aktiviert wird. Wenn es nicht eingelegt wird, können Sie es nicht an die anderen Ressourcen eines anderen Prozesses, Computers usw. senden. Siehe auch hier für ein gutes Beispiel.

Dazu verwende ich Dill , der fast alles in Python serialisieren kann. Dill hat auch einige gute Tools, die Ihnen helfen, zu verstehen, warum Ihr Beizen fehlschlägt, wenn Ihr Code fehlschlägt.

Und ja, die Benutzer verwenden die Auswahl, um den Status einer Berechnung oder Ihrer Ipython- Sitzung oder was auch immer zu speichern . Sie können Pickles Pickler und UnPickler auch erweitern, um die Komprimierung mit bz2oder durchzuführen, gzipwenn Sie möchten .

Mike McKerns
quelle
0

Ich finde es besonders nützlich bei großen und komplexen benutzerdefinierten Klassen. In einem bestimmten Beispiel, an das ich denke, war das "Sammeln" der Informationen (aus einer Datenbank) zum Erstellen der Klasse bereits die halbe Miete. Dann können diese in der Klasse gespeicherten Informationen zur Laufzeit vom Benutzer geändert werden.

Sie könnten eine andere Gruppe von Tabellen in der Datenbank haben und eine andere Funktion schreiben, um alles Gespeicherte durchzugehen und in die neuen Datenbanktabellen zu schreiben. Dann müssten Sie eine weitere Funktion schreiben, um etwas zu laden, das durch Einlesen all dieser Informationen gespeichert wurde.

Alternativ können Sie die gesamte Klasse unverändert auswählen und diese dann in einem einzelnen Feld in der Datenbank speichern. Wenn Sie es dann wieder laden, wird alles auf einmal wieder geladen, wie es zuvor war. Dies kann beim Speichern und Abrufen komplizierter Klassen viel Zeit und Code sparen.

Huhn max
quelle
-1

es ist eine Art Serialisierung. Verwenden Sie cPickle, es ist viel schneller als Pickle.

import pickle
##make Pickle File
with open('pickles/corups.pickle', 'wb') as handle:
    pickle.dump(corpus, handle)

#read pickle file
with open('pickles/corups.pickle', 'rb') as handle:
    corpus = pickle.load(handle)
Paritosh Yadav
quelle