Python Language
피클 데이터 직렬화
수색…
통사론
pickle.dump (객체, 파일, 프로토콜) # 객체 직렬화
pickle.load (file) # 객체를 직렬화 해제하려면
pickle.dumps (object, protocol) # 객체를 바이트로 직렬화한다.
pickle.loads (buffer) # 객체를 바이트에서 직렬화 해제하려면
매개 변수
매개 변수 | 세부 |
---|---|
목적 | 저장 대상의 오브젝트 |
파일 | 객체를 포함하는 열린 파일 |
실험 계획안 | 물체를 산란시키기 위해 사용되는 프로토콜 (선택적 매개 변수) |
완충기 | 직렬화 된 오브젝트를 포함한 bytes 객체 |
비고
피클 블 유형
다음 개체는 picklable입니다.
-
None
,True
및False
- 숫자 (모든 유형의)
- 문자열 (모든 유형의 문자열)
-
tuple
s,list
s,set
s, picklable 오브젝트만을 포함하는dict
- 모듈의 최상위 레벨에서 정의 된 함수
- 내장 함수
- 모듈의 최상위 레벨에 정의 된 클래스
-
__dict__
또는__getstate__()
호출 결과가__getstate__()
인 클래스의 인스턴스 (자세한 내용 은 공식 문서 참조).
-
Python 공식 문서를 기반으로합니다.
pickle
및 보안
피클 모듈이 안전하지 않습니다 . 신뢰할 수없는 사람 (예 : 인터넷)에서 일련 번호가 지정된 데이터를 수신 할 때는 사용해서는 안됩니다.
피클을 사용하여 객체 직렬화 및 비 직렬화
pickle
모듈은 임의의 파이썬 객체를 일련의 바이트로 바꾸는 알고리즘을 구현합니다. 이 프로세스는 객체 직렬화 라고도합니다. 그런 다음 객체를 나타내는 바이트 스트림을 전송하거나 저장할 수 있으며 이후 재구성하여 동일한 특성을 가진 새로운 객체를 만들 수 있습니다.
가장 간단한 코드의 경우 dump()
및 load()
함수를 사용합니다.
개체를 serialize하려면
import pickle
# An arbitrary collection of objects supported by pickle.
data = {
'a': [1, 2.0, 3, 4+6j],
'b': ("character string", b"byte string"),
'c': {None, True, False}
}
with open('data.pickle', 'wb') as f:
# Pickle the 'data' dictionary using the highest protocol available.
pickle.dump(data, f, pickle.HIGHEST_PROTOCOL)
개체를 deserialize하려면
import pickle
with open('data.pickle', 'rb') as f:
# The protocol version used is detected automatically, so we do not
# have to specify it.
data = pickle.load(f)
피클 및 바이트 객체 사용
사용으로 직렬화 바이트 객체 아웃 직렬화하는 것도 가능하다 dumps
및 loads
동등한 기능 dump
및 load
.
serialized_data = pickle.dumps(data, pickle.HIGHEST_PROTOCOL)
# type(serialized_data) is bytes
deserialized_data = pickle.loads(serialized_data)
# deserialized_data == data
Pickled Data 사용자 정의
일부 데이터는 절이 수 없습니다. 다른 데이터는 다른 이유로 절인해서는 안됩니다.
절인 될 내용은 __getstate__
메소드에서 정의 할 수 있습니다. 이 메소드는 picklable 인 것을 반환해야합니다.
oposite 측면에서 __setstate__
: __getstate__
생성 한 것을 __getstate__
객체를 초기화해야합니다.
class A(object):
def __init__(self, important_data):
self.important_data = important_data
# Add data which cannot be pickled:
self.func = lambda: 7
# Add data which should never be pickled, because it expires quickly:
self.is_up_to_date = False
def __getstate__(self):
return [self.important_data] # only this is needed
def __setstate__(self, state):
self.important_data = state[0]
self.func = lambda: 7 # just some hard-coded unpicklable function
self.is_up_to_date = False # even if it was before pickling
이제이 작업을 수행 할 수 있습니다.
>>> a1 = A('very important')
>>>
>>> s = pickle.dumps(a1) # calls a1.__getstate__()
>>>
>>> a2 = pickle.loads(s) # calls a1.__setstate__(['very important'])
>>> a2
<__main__.A object at 0x0000000002742470>
>>> a2.important_data
'very important'
>>> a2.func()
7
여기서 구현은 [self.important_data]
하나의 값으로 목록을 작성합니다. 이것은 단지 __getstate__
, __setstate__
가 어떻게 __setstate__
를 수행하는지 아는 한, __getstate__
는 __getstate__
을 반환 할 수있었습니다. 좋은 대안은 모든 값의 사전입니다 : {'important_data': self.important_data}
.
생성자가 호출되지 않았습니다! 앞의 예제 인스턴스에서 a2
는 pickle.loads
에서 A.__init__
호출하지 않고 작성되었으므로 A.__setstate__
은 __init__
이 호출 된 경우 초기화 된 모든 것을 초기화해야했습니다.