수색…


통사론

  • pickle.dump (객체, 파일, 프로토콜) # 객체 직렬화

  • pickle.load (file) # 객체를 직렬화 해제하려면

  • pickle.dumps (object, protocol) # 객체를 바이트로 직렬화한다.

  • pickle.loads (buffer) # 객체를 바이트에서 직렬화 해제하려면

매개 변수

매개 변수 세부
목적 저장 대상의 오브젝트
파일 객체를 포함하는 열린 파일
실험 계획안 물체를 산란시키기 위해 사용되는 프로토콜 (선택적 매개 변수)
완충기 직렬화 된 오브젝트를 포함한 bytes 객체

비고

피클 블 유형

다음 개체는 picklable입니다.

  • None , TrueFalse
  • 숫자 (모든 유형의)
  • 문자열 (모든 유형의 문자열)
  • 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)

피클 및 바이트 객체 사용

사용으로 직렬화 바이트 객체 아웃 직렬화하는 것도 가능하다 dumpsloads 동등한 기능 dumpload .

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} .

생성자가 호출되지 않았습니다! 앞의 예제 인스턴스에서 a2pickle.loads 에서 A.__init__ 호출하지 않고 작성되었으므로 A.__setstate____init__ 이 호출 된 경우 초기화 된 모든 것을 초기화해야했습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow