Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonオブジェクトのシリアル化(Pickle)


オブジェクトのシリアル化という用語は、オブジェクトの状態をバイトストリームに変換するプロセスを指します。作成されると、このバイトストリームはさらにファイルに保存したり、ソケットなどを介して送信したりできます。一方、バイトストリームからオブジェクトを再構築することは、逆シリアル化と呼ばれます。

Pythonのシリアル化と逆シリアル化の用語は、それぞれピクルスとアンピクルスです。 Pythonの標準ライブラリで利用可能なpickleモジュールは、シリアル化(dump()とdumps())および逆シリアル化(load()とloads())の関数を提供します。

pickleモジュールは、Python固有のデータ形式を使用します。したがって、Pythonで記述されていないプログラムは、エンコードされた(ピクルスにされた)データを適切に逆シリアル化できない可能性があります。また、認証されていないソースからデータを取得することは安全であるとは見なされません。

ピクルスプロトコル

プロトコルは、バイナリデータとの間でPythonオブジェクトを構築および分解する際に使用される規則です。現在、pickleモジュールは以下にリストされている5つの異なるプロトコルを定義しています-

プロトコルバージョン0 以前のバージョンと下位互換性のある元の「人間が読める」プロトコル。
プロトコルバージョン1 古いバイナリ形式は以前のバージョンのPythonとも互換性があります。
プロトコルバージョン2 Python 2.3で導入されたものは、新しいスタイルのクラスの効率的なピクルスを提供します。
プロトコルバージョン3 Python3.0で追加されました。他のPython3バージョンとの互換性が必要な場合に推奨されます。
プロトコルバージョン4 はPython3.4で追加されました。非常に大きなオブジェクトのサポートを追加します

Pythonインストールの最高のデフォルトのプロトコルバージョンを知るには、pickleモジュールで定義されている次の定数を使用します

>>> import pickle
>>> pickle.HIGHEST_PROTOCOL
4
>>> pickle.DEFAULT_PROTOCOL
3

前述のように、pickleモジュールのdump()関数とload()関数は、Pythonデータのpickle化とunpicklingを実行します。 dump()関数はpickle化されたオブジェクトをファイルに書き込み、load()関数はファイルからPythonオブジェクトへのデータのpickle化を解除します。

次のプログラムは、辞書オブジェクトをバイナリファイルにピクルスします。

import pickle
f = open("data.txt","wb")
dct = {"name":"Ravi", "age":23, "Gender":"M","marks":75}
pickle.dump(dct,f)
f.close()

上記のコードを実行すると、辞書オブジェクトのバイト表現がdata.txtファイルに保存されます。

バイナリファイルから辞書にデータをアンピックまたは逆シリアル化するには、次のプログラムを実行します

import pickle
f = open("data.txt","rb")
d = pickle.load(f)
print (d)
f.close()

Pythonコンソールには、ファイルから読み取られた辞書オブジェクトが表示されます

{'age': 23, 'Gender': 'M', 'name': 'Ravi', 'marks': 75}

pickleモジュールは、pickle化されたデータの文字列表現を返すdumps()関数でも構成されています。

>>> from pickle import dump
>>> dct = {"name":"Ravi", "age":23, "Gender":"M","marks":75}
>>> dctstring = dumps(dct)
>>> dctstring
b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x04\x00\x00\x00Raviq\x02X\x03\x00\x00\x00ageq\x03K\x17X\x06\x00\x00\x00Genderq\x04X\x01\x00\x00\x00Mq\x05X\x05\x00\x00\x00marksq\x06KKu.'

load()関数を使用して、文字列の選択を解除し、元の辞書オブジェクトを取得します。

>>> from pickle import load
>>> dct = loads(dctstring)
>>> dct
{'name': 'Ravi', 'age': 23, 'Gender': 'M', 'marks': 75}

pickleモジュールは、PicklerクラスとUnpicklerクラスも定義します。 Picklerクラスは、pickleデータをファイルに書き込みます。 Unpicklerクラスは、ファイルからバイナリデータを読み取り、Pythonオブジェクトを構築します

Pythonオブジェクトのピクルスデータを書き込むには

from pickle import pickler
f = open("data.txt","wb")
dct = {'name': 'Ravi', 'age': 23, 'Gender': 'M', 'marks': 75}
Pickler(f).dump(dct)
f.close()

バイナリファイルの選択を解除してデータを読み戻すには

from pickle import Unpickler
f = open("data.txt","rb")
dct = Unpickler(f).load()
print (dct)
f.close()

すべてのPython標準データ型のオブジェクトを選択できます。さらに、カスタムクラスのオブジェクトは、ピクルス化およびピクルス解除することもできます。

from pickle import *
class person:
def __init__(self):
self.name = "XYZ"
self.age = 22
def show(self):
print ("name:", self.name, "age:", self.age)
p1 = person()
f = open("data.txt","wb")
dump(p1,f)
f.close()
print ("unpickled")
f = open("data.txt","rb")
p1 = load(f)
p1.show()

Pythonライブラリには、Pythonオブジェクトの内部シリアル化に使用されるマーシャルモジュールもあります。


  1. Pythonでの統計的思考

    統計は、mlとAIを学ぶための基本です。 Pythonはこれらのテクノロジーに最適な言語であるため、統計分析を組み込んだPythonプログラムの作成方法を説明します。この記事では、さまざまなPythonモジュールを使用してグラフやチャートを作成する方法を説明します。このさまざまなグラフは、データをすばやく分析し、内部を導き出すのに役立ちます。 データの準備 さまざまなシードに関するデータを含むデータセットを取得します。このデータセットは、以下のプログラムに示されているリンクのkaggleで入手できます。さまざまなシードの特徴を比較するためのさまざまなタイプのチャートを作成するために使用される

  2. Pythonで国勢調査データを分析する

    国勢調査とは、特定の人口に関する情報を体系的に記録することです。キャプチャされたデータには、人口統計、経済、居住の詳細など、さまざまなカテゴリの情報が含まれます。これは、最終的に政府が現在のシナリオと将来の計画を理解するのに役立ちます。この記事では、Pythonを活用してインドの人口の人口調査データを分析する方法を説明します。さまざまな人口統計学的および経済的側面を見ていきます。次に、分析をグラフィカルに投影する電荷をプロットします。 kaggleから収集されたソース。ここにあります。 データの整理 以下のプログラムでは、最初に短いPythonプログラムを使用してデータを取得します。さらに分