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를 다음과 같은 형태로 제공합니다. Pickler 과 Unpickler 클래스.
위에서 언급했듯이 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)