Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

예제로 배우는 파이썬 피클링(Pickling) 핵심 가이드

이 글에서는 파이썬에서 다양한 데이터 타입을 피클링(pickling)하는 방법을 예제와 함께 살펴봅니다. 불리언(Boolean), 정수(Integer), 실수(Float), 복소수(Complex), 문자열(String), 튜플(Tuple), 리스트(List), 셋(Set), 그리고 피클링 가능한 객체를 담고 있는 딕셔너리(Dictionary)까지 모두 피클링할 수 있습니다. 반면 제너레이터(generator), 함수 내부에 정의된 지역 클래스, 람다(lambda) 함수처럼 일부 객체는 피클링이 불가능합니다.

피클링이란 무엇인가?

피클링은 파이썬 객체와 관련 자료 구조를 직렬화(serialize)하고 역직렬화(deserialize)하는 연속적인 과정을 의미하며, '마샬링(marshalling)' 또는 '플래트닝(flattening)'이라고도 부릅니다. 이 과정에서 메모리에 존재하는 객체가 디스크에 저장하거나 로컬 네트워크를 통해 전송할 수 있는 바이트(byte) 형태로 변환됩니다.

대표적으로 사용되는 함수는 두 가지입니다.
- pickle.dump(객체, 파일): 객체를 직렬화하여 파일에 저장합니다.
- pickle.load(파일): 파일에서 바이트를 읽어 원래 객체로 역직렬화합니다.

사용 시 제약 사항

서로 다른 프로그래밍 언어 간에 데이터를 공유해야 하는 상황이라면 pickle 모듈 사용은 권장되지 않습니다. 즉, pickle은 크로스 플랫폼(cross-platform) 호환성을 보장하지 않으며, 기본적으로 파이썬 전용 포맷입니다.

또한 파일 처리 없이도 원시 데이터(raw data)에 대해 피클링을 수행할 수 있습니다. 이번 튜토리얼에서는 직렬화 과정을 통해 원시 데이터를 바이너리 파일로 저장하고 다시 불러오는 방법을 배워보겠습니다.

예제 코드

# 파이썬 피클링 예제
import pickle as pk

def learnData():
    # 데이터베이스에 저장할 데이터
    dict_1 = {'tutorial':'point','Python':'3.x'}
    dict_2 = {'Data structure':'dictionary','pickling':'serialization'}
    # 데이터베이스 역할을 할 딕셔너리
    db = {}
    db['1'] = dict_1
    db['2'] = dict_2
    # 파일 포인터로 바이너리 파일을 추가(append) 모드로 열기
    fp = open('Newfile', 'ab')
    # (저장할 객체, 대상 파일)
    pk.dump(db, fp)
    fp.close()

def displayData():
    # 파일 포인터로 바이너리 파일을 읽기(read) 모드로 열기
    fp = open('Newfile', 'rb')
    db = pk.load(fp)
    for i in db:
        print(i, '=>', db[i])
    fp.close()

if __name__ == '__main__':
    learnData()
    displayData()

코드 설명

learnData() 함수는 두 개의 딕셔너리를 하나의 db 딕셔너리에 담은 뒤, 'ab'(추가 + 바이너리) 모드로 파일을 열고 pickle.dump()로 객체를 직렬화하여 저장합니다. displayData() 함수는 같은 파일을 'rb'(읽기 + 바이너리) 모드로 열어 pickle.load()로 객체를 복원한 후 화면에 출력합니다.

실행 결과

dict_1 = {'tutorial':'point','Python':'3.x'}
dict_2 = {'Data structure':'dictionary','pickling':'serialization'}

결론

이 글에서는 파이썬 3.x 및 그 이전 버전에서 내장 pickle 모듈을 활용해 객체를 피클링하고 언피클링(unpickling)하는 방법을 배웠습니다. pickle은 파이썬 객체를 그대로 보존하며 저장·전송할 수 있는 강력한 도구이지만, 파이썬 외 환경과의 호환성이 필요하다면 JSON 같은 범용 포맷을 사용하는 것이 좋습니다.