JLOG

[Python] Pickle이란 / 파이썬 피클 사용하기 본문

Python/함수

[Python] Pickle이란 / 파이썬 피클 사용하기

정정선선 2021. 3. 30. 02:16

MxNet 만들어진 FaceDetector code를 리뷰하다가 xxx.pkl 파일을 load 하는 것을 확인했다.

pkl 파일 형식은 처음 보아서 어떨 때 쓰이는 지 찾아보았다.

 

+참고 : pkl를 사용하는 예시 코드

def gt_roidb(self):
        cache_file = os.path.join(
            self.cache_path,
            '{}_{}_gt_roidb.pkl'.format(self.name, self._split))
        if os.path.exists(cache_file):
            with open(cache_file, 'rb') as fid:
                roidb = pickle.load(fid)
            print('{} gt roidb loaded from {}'.format(self.name, cache_file))
            self.num_images = len(roidb)
            return roidb

 

 


Pickle이란

pickle은 텍스트 상태의 데이터가 아닌 파이썬 객체 자체를 바이너리 파일로 저장하는 것이라고 한다.

 

즉, 텍스트 형태로 파일을 저장하는 것이 아니라 dictionary, list, tuple과 같은 형태로 필요한 부분을 저장하는 것이다. 하지만 문자열이 아닌 객체를 파일에 쓸 수 없기 때문에 pickle 모듈을 활용해 그 객체 자체를 바이너리로 저장하는 것이라고 한다.[1]

 

장점

  • 빠르다text 파일을 사용하는 경우 필요한 부분들을 파싱해야 하지만 pickle은 이미 필요한 형태대로 저장이 되어 있기 때문에 훨씬 빠르다고 한다.

 

주의점

  • 안전하지 않다[2]pickle module은 안전하지 않고 unpickle data만 신뢰할 수 있다고 한다.RCE(원격코드실행) 공격을 받을 수 있어, 다운 받은 pickle 파일을 사용할 때 매우 주의해야 한다.
  •  
  • 검증 되지 않은 pickle data를 unpicking하게 될 때 임의의 코드가 실행될 수 있다고 한다.

pickle의 취약점에 대해서는 아래 블로그에 잘 나와있어서 참고하면 좋을 것 같다.

https://watchout31337.tistory.com/167

 

 

 

 

 

사용법

# pickle 파일 저장
pickle.dump('객체', '파일')

# pickle 파일 로드
pickle.load('파일')

 

예시 코드

 

import pickle

list = ['a', 'b', 'c']

## Save pickle
with open('data.pickle', 'wb') as f:
    pickle.dump(list, f)

## Load pickle
with open("data.pickle","rb") as fr:
    data = pickle.load(fr)
print(data)

#['a', 'b', 'c']

위 코드는 [1]를 참조했다.

 

 

[1]https://korbillgates.tistory.com/173

[2]https://docs.python.org/3/library/pickle.html

 

Comments