Heim >Backend-Entwicklung >Python-Tutorial >Detaillierte Erläuterung der Verwendung der Pickle-Bibliothek
Die Verwendung der Pickle-Bibliothek wird im Artikel „Verstehen, was maschinelles Lernen anhand eines einfachen Beispiels ist“ erwähnt und in diesem Artikel näher erläutert.
Warum brauchen Sie also Serialisierung und Deserialisierung?
Einfach zu lagern. Der Serialisierungsprozess wandelt Textinformationen in einen Strom binärer Daten um. Auf diese Weise können die Informationen problemlos auf der Festplatte gespeichert werden. Wenn eine Datei gelesen werden muss, werden die Daten von der Festplatte gelesen und dann deserialisiert, um die Originaldaten zu erhalten. Wenn das Python-Programm ausgeführt wird, werden einige Daten wie Zeichenfolgen, Listen und Wörterbücher für eine lange Zeit gespeichert, anstatt sie einfach im Speicher abzulegen und die Daten beim Einschalten zu verlieren aus. Das Pickle-Modul in der Python-Modulsammlung ist praktisch, es kann Objekte in ein Format konvertieren, das übertragen oder gespeichert werden kann.
Die Funktion „loads()“ führt die gleiche Deserialisierung durch wie die Funktion „load()“. Anstatt ein Stream-Objekt zu akzeptieren und die serialisierten Daten aus einer Datei zu lesen, akzeptiert es ein str-Objekt, das die serialisierten Daten enthält, und gibt das Objekt direkt zurück.
Codebeispiel:
[python] view plain copy #!/usr/bin/env python # -*- coding: UTF-8 -*- import cPickle as pickle obj = 123, "abcdedf", ["ac", 123], {"key": "value", "key1": "value1"} print obj# 输出:(123, 'abcdedf', ['ac', 123], {'key1': 'value1', 'key': 'value'}) # 序列化到文件 with open(r"d:\a.txt", "r+") as f: pickle.dump(obj, f) with open(r"d:\a.txt") as f: print pickle.load(f)# 输出:(123, 'abcdedf', ['ac', 123], {'key1': 'value1', 'key': 'value'}) # 序列化到内存(字符串格式保存),然后对象可以以任何方式处理如通过网络传输 obj1 = pickle.dumps(obj) print type(obj1)# 输出:<type 'str'> print obj1# 输出:python专用的存储格式 obj2 = pickle.loads(obj1) print type(obj2)# 输出:<type 'tuple'> print obj2# 输出:(123, 'abcdedf', ['ac', 123], {'key1': 'value1', 'key': 'value'})
2. Einfach zu übertragen. Wenn zwei Prozesse remote kommunizieren, können sie einander verschiedene Arten von Daten senden. Unabhängig von der Art der Daten werden sie in Form einer Binärsequenz über das Netzwerk übertragen. Der Sender muss dieses Objekt in eine Bytesequenz umwandeln, bevor es im Netzwerk übertragen werden kann. Der Empfänger muss die Bytesequenz in ein Objekt wiederherstellen.
Verstehen Sie anhand eines einfachen Beispiels, was maschinelles Lernen ist
Pickle ist ein Standardmodul der Python-Sprache. Die Pickle-Bibliothek ist nach der Installation enthalten Python. Es ist nicht erforderlich, es separat zu installieren.
Das Pickle-Modul implementiert die grundlegende Datenserialisierung und -deserialisierung. Durch die Serialisierungsoperation des Pickle-Moduls können wir die im Programm ausgeführten Objektinformationen in einer Datei speichern und durch die Deserialisierungsoperation des Pickle-Moduls das vom letzten Programm gespeicherte Objekt aus der Datei erstellen.
In der offiziellen Einführung enthält die englische Beschreibung des Serialisierungsvorgangs mehrere Wörter, z. B. „Serialisieren“, „Beizen“, „Serialisieren“, „Marshalling“ oder „Flattening“ usw., die alle den Serialisierungsmittelwert darstellen. Dementsprechend gibt es viele englische Wörter für Deserialisierungsoperationen, wie zum Beispiel „deserializing“, „unpickling“, „deserailization“ usw. Um Verwirrung zu vermeiden, verwenden Sie im Allgemeinen „pickling“/„unpickling“ oder „serialization“/„deserailization“. pickle
Das Modul wird in binärer Form serialisiert und in einer Datei gespeichert (das Suffix der gespeicherten Datei ist „.pkl“) und kann nicht direkt zur Vorschau geöffnet werden. Ein weiteres Serialisierungsstandardmodul von Python json
ist für Menschen lesbar und kann direkt geöffnet und angezeigt werden (z. B. in Notepad++ angezeigt).
Das Pickle-Modul verfügt über zwei Haupttypen von Schnittstellen, nämlich Serialisierung und Deserialisierung.
wird häufig auf diese Weise verwendet:
[python] view plain copy import cPickle as pickle pickle.dump(obj,f) pickle.dumps(obj,f) pickle.load(f) pickle.loads(f)
Der Serialisierungsvorgang umfasst:
pickle.dump()
Deserialisierungsvorgänge umfassen:
Pickler(file, protocol).dump(obj)
pickle.load()
Unpickler(file).load()
序列化的方法为 pickle.dump()
,该方法的相关参数如下:
pickle.dump(obj, file, protocol=None,*,fix_imports=True)
该方法实现的是将序列化后的对象obj以二进制形式写入文件file中,进行保存。它的功能等同于 Pickler(file, protocol).dump(obj)
。
关于参数file,有一点需要注意,必须是以二进制的形式进行操作(写入)。
参考前文的案例如下:
import picklewith open('svm_model_iris.pkl', 'wb') as f: pickle.dump(svm_classifier, f)
file为’svm_model_iris.pkl’,并且以二进制的形式(’wb’)写入。
关于参数protocol,一共有5中不同的类型,即(0,1,2,3,4)。(0,1,2)对应的是python早期的版本,(3,4)则是在python3之后的版本。
此外,参数可选 pickle.HIGHEST_PROTOCOL和pickle.DEFAULT_PROTOCOL。当前,python3.5版本中,pickle.HIGHEST_PROTOCOL的值为4,pickle.DEFAULT_PROTOCOL的值为3。当protocol参数为负数时,表示选择的参数是pickle.HIGHEST_PROTOCOL。
关于参数protocol,官方的详细介绍如下:
pickle.dumps()
方法的参数如下:
pickle.dumps(obj, protocol=None,*,fix_imports=True)pickle.dumps()
方法跟pickle.dump()
方法的区别在于,pickle.dumps()
方法不需要写入文件中,它是直接返回一个序列化的bytes对象。
pickle模块提供了序列化的面向对象的类方法,即 class pickle.Pickler(file, protocol=None,*,fix_imports=True)
,Pickler类有dump()方法。
Pickler(file, protocol).dump(obj) 实现的功能跟 pickle.dump() 是一样的。
关于Pickler类的其他method,请参考官方API。
插播一条硬广:技术文章转发太多,本文来自微信公众号:“Python数据之道”(ID:PyDataRoad)。
序列化的方法为 pickle.load()
,该方法的相关参数如下:
pickle.load(file, *,fix_imports=True, encoding=”ASCII”. errors=”strict”)
该方法实现的是将序列化的对象从文件file中读取出来。它的功能等同于 Unpickler(file).load()
。
关于参数file,有一点需要注意,必须是以二进制的形式进行操作(读取)。
参考前文的案例如下:
import picklewith open('svm_model_iris.pkl', 'rb') as f: model = pickle.load(f)
file为’svm_model_iris.pkl’,并且以二进制的形式(’rb’)读取。
读取的时候,参数protocol是自动选择的,load()方法中没有这个参数。
pickle.loads()
方法的参数如下:
pickle.loads(bytes_object, *,fix_imports=True, encoding=”ASCII”. errors=”strict”)pickle.loads()
方法跟pickle.load()
方法的区别在于,pickle.loads()
方法是直接从bytes对象中读取序列化的信息,而非从文件中读取。
pickle模块提供了反序列化的面向对象的类方法,即 class pickle.Unpickler(file, *,fix_imports=True, encoding="ASCII". errors="strict")
,Pickler类有load()方法。
Unpickler(file).load() 实现的功能跟 pickle.load() 是一样的。
关于Unpickler类的其他method,请参考官方API。
官方文档是这么介绍的,这里我就不进一步描述了。
pickle模块还是比较实用的,当然,关于pickle模块,其实还有许多的信息可以去了解,想了解更多信息的童鞋,建议可以阅读下python官方的API文档(library文件)。
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Verwendung der Pickle-Bibliothek. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!