Python-data-persistence-pickle-module

提供:Dev Guides
移動先:案内検索

Pythonデータの永続性-Pickleモジュール

シリアライゼーションとデシリアライゼーションに関するPythonの用語は、それぞれ酸洗いと酸洗いです。 Pythonライブラリのpickleモジュールは、Python固有のデータ形式を使用しています。 したがって、Python以外のアプリケーションでは、ピクルされたデータを適切にデシリアライズできない場合があります。 また、認証されていないソースからデータを取り出さないようにすることもお勧めします。

シリアル化(ピクル化)されたデータは、バイト文字列またはバイナリファイルに格納できます。 このモジュールは、バイト文字列を使用してデータをピクル処理およびアンピクル処理する* dumps()および loads()関数を定義します。 ファイルベースのプロセスの場合、モジュールには dump()および load()*関数があります。

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

Sr.No. Names & Description
1

Protocol version 0

以前のバージョンと下位互換性のある元の「人間が読める」プロトコル。

2

Protocol version 1

古いバイナリ形式は、以前のバージョンのPythonとも互換性があります。

3

Protocol version 2

Python 2.3で導入された新しいスタイルのクラスの効率的なpickle化を提供します。

4

Protocol version 3

Python 3.0で追加されました。 他のPython 3バージョンとの互換性が必要な場合に推奨されます。

5

Protocol version 4

Python 3.4で追加されました。 非常に大きなオブジェクトのサポートを追加します

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

from pickle import dump
dct={"name":"Ravi", "age":23, "Gender":"M","marks":75}
dctstring=dumps(dct)
print (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)
print (dct)

出力

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

漬物オブジェクトは、dump()関数を使用して永続的にディスクファイルに格納し、load()関数を使用して取得することもできます。

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

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

pickleモジュールは、 Pickler および Unpickler クラスの形式でシリアル化メカニズム用のオブジェクト指向APIも提供します。

上記のように、Pythonの組み込みオブジェクトと同様に、ユーザー定義クラスのオブジェクトも永続的にディスクファイルにシリアル化できます。 次のプログラムでは、名前と携帯電話番号をインスタンス属性としてUserクラスを定義しています。 init()コンストラクタに加えて、クラスはオブジェクトの文字列表現を返すstr()メソッドをオーバーライドします。

class User:
   def __init__(self,name, mob):
      self.name=name
      self.mobile=mob
   def __str__(self):
return ('Name: {} mobile: {} '. format(self.name, self.mobile))

上記のクラスのオブジェクトをファイル内でピクルするには、ピッカークラスとそのdump()メソッドを使用します。

from pickle import Pickler
user1=User('Rajani', 'raj@gmail.com', '1234567890')
file=open('userdata','wb')
Pickler(file).dump(user1)
Pickler(file).dump(user2)
file.close()

逆に、Unpicklerクラスには、次のようにシリアライズされたオブジェクトを取得するload()メソッドがあります-

from pickle import Unpickler
file=open('usersdata','rb')
user1=Unpickler(file).load()
print (user1)