Python Pickle 모듈에 대해 정리한 글입니다. [Updating 중입니다]
모듈이란 클래스, 함수, 변수 들을 모아 놓은 스크립트 파일로서 주로 간단한 기능을 담을 때 사용한다. 파이썬 모듈의 경우 파이썬 코드를 묶어서 관리하고 사용할 수 있도록 구성되어 있고 보통 하나의 .py 파일이 하나의 모듈이 된다.
from Module(모듈 이름) import Class(클래스명)
import Module(모듈 이름)
Python
파이썬의 경우 표준 라이브러리를 통해 다양한 모듈들을 제공하고 있고, 파이썬을 설치할 때 함께 설치된다. 여기서 라이브러리란, 프로그램의 구성 요소로 사용하기 위해 미리 만들어 둔 프로그램 조각으로 자주 사용하는 기능들을 모아 모듈 또는 패키지로 만든 것이다. 한 번 만들어두면 계속 사용할 수 있고 다른 사람들과도 공유할 수 있다. 표준 라이이브러리의 경우, 파이썬이 공식적으로 제공하는 모듈로서 파이썬으로 프로그램을 작성할 때 가장 중요하고 빈번히 사용되는 기능들을 모듈로 묶어 제공한다.
수많은 파이썬 모듈들 중 Pickle에 대해 알아보려고 한다.
1. Pickle?
텍스트가 아닌 자료형 데이터/객체 자체를 저장하고 불러올 때 유용한 모듈이다. 즉 원하는 데이터를 자료형 변경 없이 파일로 저장해서 사용할 수 있다. Pickle은 방대한 파일에서 필요한 객체 자체를 binary 형태로 저장한다. 따라서 용량도 매우 작고 저장된 파일을 불러오는 형태라 속도도 빠르다.
Pickle 모듈을 사용하기 위해 먼저 모듈 임포트가 필요하다. 아래와 같이 한 번 임포트한 .py 파일 내에서는 추가 임포트 없이 사용할 수 있다.
import pickle
Python
2. How to Use Pickle.
Pickle의 사용법은 꽤나 간단하다.
import pickle
data = {
'num': [-1, 0, 1, 1e-4],
'txt': ("cute dog", "small cat"),
'bool': {True, False, None}
}
Python
2.1. pickle.dump()
데이터를 저장하거나 불러올 때는 바이트 형식으로 파일을 읽고 써야한다:: 'wb' & 'rb'
•
"wb"
- binary file 쓰기 모드.
- wb 로 데이터 입력하는 경우 .bin 확장자를 이용하는 것이 좋다.
•
pickle.dump()
- 파이썬 객체를 직렬화(serialization)하여 binary file에 저장하기
# save
with open('data_list.bin', 'wb') as file:
for data in txt_list:
pickle.dump(data, file)
# pickle.dump(MyObject, MyFile)
Python
2.2. pickle.load()
•
"rb"
- binary file 읽기 모드
•
pickle.load()
- pickle.dump()로 직렬화 되어있는 binary file로부터 파이썬 객체를 역직렬화(deserialization)
# load
with open('data.bin', 'rb') as file:
data = pickle.load(file)
# pickle.load(MyFile)
Python
(※더이상 로드할 데이터 없으면 EOFError 발생한다.)
# Whole Load process
import pickle
with open('data.bin', 'rb') as file:
data_list = []
while True:
try:
data = pickle.load(file)
except EOFError:
break
data_list.append(data)
Python
2.3. pickle.dumps()? pickle.loads()?
앞서 살펴 본 내용은 pickle.dump()와 pickle.load()였다. 그런데 공부하다 보니 뒤에 '-s'가 붙은 pickle.dumps()와 pickle.loads()가 있어 간단하게 정리해본다.
•
pickle.dumps()
◦
파이썬 객체를 직렬화하여 메모리에 binary objects로 저장
◦
사람이 읽을 수 없는 형태
◦
컴퓨터에게는 데이터 저장에 더 효율적인 형태
•
pickle.loads()
◦
pickle.dumps()로 직렬화 돼있는 bytes objects를 객체로 역직렬화