string 자료형과 같은 일반 텍스트가 아닌 list, tuple 또는 dictionary같은 자료형은 일반적인 파일 입출력 방법으로 데이터를 저장하거나 불러올 수 없다.
파이썬의 pickle 모듈은 텍스트 이외의 자료형을 파일로 저장하도록 해준다.

1. 장점

  • 파이썬의 모든 데이터 객체의 저장 및 로드가 가능하다(원하는 데이터를 자료형의 변경없이 그대로 파일로 저장 및 불러오기 가능).
  • 원하는 객체 자체를 binary로 저장하고, 필요할 때 로드만 하면 되기 때문에 속도가 빠르다.
  • pickle 방식은 사람이 읽을 수 없는 형태로 저장되나, 저장이나 전송 측면에서 효율적이다. 반면, JSON, YAML 방식은 pickle보다는 저장과 전송 측면에서 덜 효율적이지만 가독성이 좋다.


2. 주의점

💡 “The pickle module is not secure. Only unpickle data you trust.” - by pickle 공식문서

  • 악의적으로 생성된 pickle의 경우 안전하지 않으니 신뢰할 수 없는 곳에서 다운받은 pickle 데이터는 unpickling하지 않는 것이 좋다.
  • 검증되지 않은 pickle 데이터를 unpickling할 경우 임의의 코드가 실행될 수 있다.


3. 저장 및 로드

  • 저장: pickle.dump(data, file)
    • pickle로 데이터를 저장하거나 불러올 때는 파일을 binary 파일로 읽고 쓴다(wb, rb)
  • 로드: ${Variable} = pickle.load(file)
import pickle


data = {
    'no': 1,
    'subject': 'Hello, pickle',
    'content': 'Using pickle is a piece of cake.'
}

# 저장
with open('data.pkl', 'wb') as f:
    pickle.dump(data, f)

# 로드
with open('data.pkl', 'rb') as f:
    data = pickle.load(f)


  • 참고: 만약 pickle을 쓰지 않고 string type이 아닌 다른 type의 데이터를 일반적인 파일 입출력 방법으로 저장 및 로드한다면 아래와 같이 TypeError가 뜬다.
with open('data.txt', 'w') as f:
    f.write(data)

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/Users/jinsolkim/Desktop/pickle_practice.ipynb Cell 3 in <cell line: 1>()
      1 with open('data.txt', 'w') as f:
----> 2     f.write(data)

TypeError: write() argument must be str, not dict


Reference

Leave a comment