Python 데이터 지속성-Pickle 모듈

직렬화 및 역 직렬화에 대한 Python의 용어는 각각 피클 링 및 언 피클 링입니다. Python 라이브러리의 pickle 모듈은 매우 Python 특정 데이터 형식을 사용합니다. 따라서 비 Python 애플리케이션은 피클 된 데이터를 올바르게 역 직렬화하지 못할 수 있습니다. 또한 인증되지 않은 소스에서 데이터를 제거하지 않는 것이 좋습니다.

직렬화 된 (피클 된) 데이터는 바이트 문자열 또는 이진 파일에 저장할 수 있습니다. 이 모듈은dumps()loads()바이트 문자열을 사용하여 데이터를 피클 및 언 피클하는 함수. 파일 기반 프로세스의 경우 모듈은dump()load() 함수.

Python의 피클 프로토콜은 바이너리 데이터와의 사이에서 Python 객체를 구성하고 분해하는 데 사용되는 규칙입니다. 현재 pickle 모듈은 아래 나열된 5 가지 프로토콜을 정의합니다.

Sr. 아니. 이름 및 설명
1

Protocol version 0

원래의 "사람이 읽을 수있는"프로토콜은 이전 버전과 역 호환됩니다.

2

Protocol version 1

이전 바이너리 형식은 이전 버전의 Python 과도 호환됩니다.

Protocol version 2

Python 2.3에 도입되어 새로운 스타일의 클래스를 효율적으로 피클 링 할 수 있습니다.

4

Protocol version 3

Python 3.0에 추가되었습니다. 다른 Python 3 버전과의 호환성이 필요한 경우 권장됩니다.

5

Protocol version 4

Python 3.4에 추가되었습니다. 매우 큰 개체에 대한 지원을 추가합니다.

pickle 모듈은 pickled 데이터의 문자열 표현을 반환하는 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.

loads () 함수를 사용하여 문자열을 언 피클하고 원래 사전 객체를 얻습니다.

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 모듈은 또한 직렬화 메커니즘을위한 객체 지향 API를 다음과 같은 형태로 제공합니다. PicklerUnpickler 클래스.

위에서 언급했듯이 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))

파일에서 위 클래스의 객체를 피클하려면 pickler 클래스와 dump () 메소드를 사용합니다.

from pickle import Pickler
user1=User('Rajani', '[email protected]', '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)