Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python 객체 직렬화(Pickle)

<시간/>

객체 직렬화라는 용어는 객체의 상태를 바이트 스트림으로 변환하는 프로세스를 나타냅니다. 이 바이트 스트림이 생성되면 파일에 추가로 저장하거나 소켓 등을 통해 전송할 수 있습니다. 반면에 바이트 스트림에서 객체를 재구성하는 것을 역직렬화라고 합니다.

직렬화 및 역직렬화에 대한 Python의 용어는 각각 피클링 및 피클링 해제입니다. Python의 표준 라이브러리에서 사용할 수 있는 pickle 모듈은 직렬화(dump() 및 dumps()) 및 역직렬화(load() 및 load())를 위한 함수를 제공합니다.

pickle 모듈은 매우 Python 전용 데이터 형식을 사용합니다. 따라서 Python으로 작성되지 않은 프로그램은 인코딩된(피클된) 데이터를 적절하게 역직렬화하지 못할 수 있습니다. 또한 인증되지 않은 소스에서 데이터를 언피클하는 것은 안전한 것으로 간주되지 않습니다.

피클 프로토콜

프로토콜은 파이썬 객체를 바이너리 데이터로 생성하고 분해하는 데 사용되는 규칙입니다. 현재 pickle 모듈은 아래와 같이 5가지 다른 프로토콜을 정의합니다 -

프로토콜 버전 0 원래 "사람이 읽을 수 있는" 프로토콜은 이전 버전과 역호환됩니다.
프로토콜 버전 1 이전 바이너리 형식은 이전 버전의 Python과도 호환됩니다.
프로토콜 버전 2 Python 2.3에 도입되어 새로운 스타일의 클래스를 효율적으로 피클링합니다.
프로토콜 버전 3 파이썬 3.0에 추가되었습니다. 다른 Python 3 버전과의 호환성이 필요할 때 권장됩니다.
프로토콜 버전 4 는 Python 3.4에 추가되었습니다. 매우 큰 개체에 대한 지원을 추가합니다.

Python 설치의 최고 및 기본 프로토콜 버전을 확인하려면 pickle 모듈에 정의된 다음 상수를 사용하십시오.

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

앞서 언급한 것처럼 pickle 모듈의 dump() 및 load() 함수는 Python 데이터의 pickling 및 unpickling을 수행합니다. dump() 함수는 피클된 객체를 파일에 쓰고 load() 함수는 파일에서 Python 객체로 데이터를 언피클링합니다.

다음 프로그램은 사전 개체를 바이너리 파일로 피클합니다.

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() 함수를 사용하여 문자열을 unpickle하고 원래 사전 객체를 얻습니다.

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

pickle 모듈은 Pickler 및 Unpickler 클래스도 정의합니다. Pickler 클래스는 파일에 피클 데이터를 씁니다. Unpickler 클래스는 파일에서 바이너리 데이터를 읽고 Python 객체를 생성합니다.

Python 객체의 pickled 데이터를 작성하려면

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 개체의 내부 직렬화에 사용되는 마샬 모듈도 있습니다.