9.1 pickle
소개
pickle
모듈은 거의 모든 Python 객체를 파일이나 문자열로 저장하고, 원래 상태로 복원할 수 있게 해줘. pickle
은 사용자 정의 클래스 객체를 포함한 많은 데이터 타입을 지원하고 객체를 바이트 형식으로 변환하고 되돌리는 과정을 자동화해.
pickle
모듈의 주요 함수들
-
파일에 객체 읽고 쓰기
-
pickle.dump(obj, file)
: 객체obj
를 직렬화하여 열린 파일file
에 기록해. -
pickle.load(file)
: 파일file
에서 객체를 읽고 비직렬화해.
-
-
바이트 배열에 객체 읽고 쓰기
-
pickle.dumps(obj)
: 객체obj
를 직렬화하여 바이트 객체로 반환해. -
pickle.loads(bytes)
: 바이트 객체에서 객체를 비직렬화해.
-
아래에서 조금 더 자세히 설명할게:
9.2 파일로 직렬화
파일로 직렬화하는 기본 단계들:
-
파일을 바이트 쓰기 모드
(wb)
로 열기. -
pickle.dump(obj, file)
을 사용하여 객체 직렬화. -
pickle.load(file)
을 사용하여 객체 비직렬화. - 파일 닫기.
파일로 객체 직렬화 및 비직렬화
원칙적으로 pickle
은 무엇을 직렬화하든 상관없어. 예를 들어, 리스트를 직렬화하는 방법은 다음과 같아:
import pickle
data = [1, 2, 3, 4, 5]
# 리스트를 파일로 직렬화
with open('list.pkl', 'wb') as file:
pickle.dump(data, file)
# 파일에서 리스트 비직렬화
with open('list.pkl', 'rb') as file:
loaded_data = pickle.load(file)
print(loaded_data) # 출력: [1, 2, 3, 4, 5]
이제 딕셔너리 객체의 직렬화를 봐봐:
import pickle
# 직렬화할 객체 예제
data = {'name': 'Alice', 'age': 30, 'is_student': False}
# 객체를 파일로 직렬화
with open('data.pkl', 'wb') as file:
pickle.dump(data, file)
# 파일에서 객체 비직렬화
with open('data.pkl', 'rb') as file:
loaded_data = pickle.load(file)
print(loaded_data) # 출력: {'name': 'Alice', 'age': 30, 'is_student': False}
객체를 저장하려면
dump()
를 호출하고, 로드하려면
load()
를 호출해. 어렵지 않지?
9.3 문자열로 직렬화
객체를 네트워크로 전송해야 할 때가 많아. 그래서 객체를 파일이 아니라 문자열로 저장해야 할 때가 있어. 이때 pickle
에는 끝에 추가 s
를 붙인 메서드 dumps
와 loads
가 있어.
문자열(또는 바이트 배열)로 직렬화 및 비직렬화하는 주요 작업:
-
pickle.dumps(obj)
를 사용하여 객체 직렬화. -
pickle.loads(data)
를 사용하여 객체 비직렬화.
문자열로 객체 직렬화 및 비직렬화
객체를 문자열(또는 바이트 세트)로 직렬화하는 것은 더 간단해 — dumps()
메서드 하나만 호출하면 돼.
예제:
import pickle
# 직렬화할 객체 예제
data = {'name': 'Bob', 'age': 25, 'is_student': True}
# 객체를 문자열로 직렬화
serialized_data = pickle.dumps(data)
print(serialized_data)
# 문자열에서 객체 비직렬화
loaded_data = pickle.loads(serialized_data)
print(loaded_data) # 출력: {'name': 'Bob', 'age': 25, 'is_student': True}
9.4 직렬화 오류
직렬화할 때 가끔 오류가 발생할 수 있어. 이 경우 pickle
모듈은 예외를 던져:
-
pickle.PicklingError
— 직렬화 중 오류. -
pickle.UnpicklingError
— 비직렬화 중 오류.
예제:
import pickle
data = {'key': 'value'}
try:
# 객체를 파일로 직렬화
with open('data.pkl', 'wb') as file:
pickle.dump(data, file)
except pickle.PicklingError as e:
print(f"직렬화 오류: {e}")
try:
# 파일에서 객체 비직렬화
with open('data.pkl', 'rb') as file:
loaded_data = pickle.load(file)
print(loaded_data)
except pickle.UnpicklingError as e:
print(f"비직렬화 오류: {e}")
보통 프로그래머로서 프로그램 실행 중 직렬화/비직렬화 오류에 대해 할 수 있는 게 별로 없어. 그저 로그에 기록해서 나중에 왜 그런 일이 일어났는지 분석할 수 있도록 하는 게 전부야.
이러한 오류의 주요 원인은 객체의 형식이 변경된 경우야. 객체를 파일에 저장한 후 프로그램이 업데이트되어 객체에 새로운 필드가 추가되거나 이전 필드가 사라졌을 때 발생할 수 있어. 따라서 오래된 저장 객체가 새로운 객체 클래스에 로드되려고 하면...
이 상황은 네트워크 작업에서도 자주 발생해 — 버전 2.18의 프로그램이 버전 3.1의 프로그램이 기대하는 것과 약간 다른 객체를 보낼 때야. 이걸 마이그레이션 문제라고 불러, 그리고 이는 장기적으로 유지되는 프로젝트에서 자주 발생하는 문제야.
GO TO FULL VERSION