pickle ライブラリの使用については、「機械学習とは何かを簡単な例で理解する」の記事で触れていますが、この記事ではさらに詳しく説明します。
では、なぜシリアル化と逆シリアル化の操作が必要なのでしょうか?
保管が簡単です。シリアル化プロセスは、テキスト情報をバイナリ データのストリームに変換します。このようにして、ファイルを読み取る必要がある場合は、データをハードディスクから読み取り、逆シリアル化して元のデータを取得することで、情報をハードディスクに簡単に保存できます。 Pythonプログラムを実行すると、文字列やリスト、辞書などのデータが取得されますが、それらをメモリに入れておくだけで電源を入れるとデータが失われるのではなく、将来のために長期保存したいと考えています。オフ。 Python モジュール コレクションの Pickle モジュールは便利で、オブジェクトを送信または保存できる形式に変換できます。
loads() 関数は、load() 関数と同じ逆シリアル化を実行します。ストリーム オブジェクトを受け入れてファイルからシリアル化されたデータを読み取る代わりに、シリアル化されたデータを含む str オブジェクトを受け入れ、そのオブジェクトを直接返します。
コードサンプル:
[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.転送が簡単。 2 つのプロセスがリモートで通信する場合、さまざまな種類のデータを相互に送信できます。データの種類に関係なく、データはバイナリ シーケンスの形式でネットワーク上に送信されます。送信者は、ネットワーク上で送信する前に、このオブジェクトをバイト シーケンスに変換する必要があります。受信者は、バイト シーケンスをオブジェクトに復元する必要があります。
簡単な例を通して機械学習とは何かを理解しましょう
pickle は Python 言語の標準モジュールであり、Python をインストールすると既に組み込まれているため、別途インストールする必要はありません。
pickle モジュールは、基本的なデータのシリアル化と逆シリアル化を実装します。 pickle モジュールのシリアル化操作を通じて、プログラム内で実行されているオブジェクト情報をファイルに保存して永続的に保存できます。pickle モジュールの逆シリアル化操作を通じて、最後のプログラムによって保存されたオブジェクトをファイルから作成できます。
公式の紹介文では、シリアル化操作の英語の説明に「serializing」、「pickle」、「serialization」、「marshalling」、「 flattening 」などのいくつかの単語があり、これらはすべてシリアル化の意味を表しています。これに対応して、「デシリアライズ」、「アンピックリング」、「デシリアライゼーション」など、逆シリアル化操作を表す英語の単語が多数あります。混乱を避けるために、通常は「pickle化」/「unpickle化」、または「serialization」/「deserailization」を使用します。 pickle
モジュールはバイナリ形式でシリアル化されてファイルに保存され (保存されたファイルの拡張子は「.pkl」)、プレビューのために直接開くことはできません。そして、Python の別のシリアル化標準モジュールjson
は人間が判読可能であり、直接開いて表示することができます (たとえば、notepad++ で表示します)。 pickle
模块是以二进制的形式序列化后保存到文件中(保存文件的后缀为”.pkl”),不能直接打开进行预览。而python的另一个序列化标准模块json
,则是human-readable的,可以直接打开查看(例如在notepad++中查看)。
pickle模块有两类主要的接口,即序列化和反序列化。
常采用这样的方式使用:
[python] view plain copy import cPickle as pickle pickle.dump(obj,f) pickle.dumps(obj,f) pickle.load(f) pickle.loads(f)
其中序列化操作包括:
pickle.dump()
反序列化操作包括:
Pickler(file, protocol).dump(obj)
pickle.load()
Unpickler(file).load()
import picklewith open('svm_model_iris.pkl', 'wb') as f: pickle.dump(svm_classifier, f)
import picklewith open('svm_model_iris.pkl', 'rb') as f: model = pickle.load(f)
pickle.load()
🎜🎜🎜🎜Pickler(file, protocol).dump(obj)
。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文件)。
以上がpickleライブラリの使い方を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。