CodeGym /자바 코스 /Python SELF KO /pickle 사용하기

pickle 사용하기

Python SELF KO
레벨 22 , 레슨 1
사용 가능

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 파일로 직렬화

파일로 직렬화하는 기본 단계들:

  1. 파일을 바이트 쓰기 모드 (wb)로 열기.
  2. pickle.dump(obj, file)을 사용하여 객체 직렬화.
  3. pickle.load(file)을 사용하여 객체 비직렬화.
  4. 파일 닫기.

파일로 객체 직렬화 및 비직렬화

원칙적으로 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를 붙인 메서드 dumpsloads가 있어.

문자열(또는 바이트 배열)로 직렬화 및 비직렬화하는 주요 작업:

  • 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의 프로그램이 기대하는 것과 약간 다른 객체를 보낼 때야. 이걸 마이그레이션 문제라고 불러, 그리고 이는 장기적으로 유지되는 프로젝트에서 자주 발생하는 문제야.

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION