[Python] πŸ₯’ Pickle

김토리·2025λ…„ 2μ›” 21일

Python

λͺ©λ‘ 보기
2/2

πŸ₯’ What is 'pickle' ?

pickle λͺ¨λ“ˆμ€ 파이썬 객체 ꡬ쑰의 직렬화와 μ—­ 직렬화λ₯Ό μœ„ν•œ λ°”μ΄λ„ˆλ¦¬ ν”„λ‘œν† μ½œμ„ κ΅¬ν˜„ν•©λ‹ˆλ‹€. β€œν”Όν΄λ§(pickling)”은 파이썬 객체 계측 ꡬ쑰가 λ°”μ΄νŠΈ 슀트림으둜 λ³€ν™˜λ˜λŠ” 절차이며, β€œμ—­ 피클링(unpickling)”은 λ°˜λŒ€ μ—°μ‚°μœΌλ‘œ, (λ°”μ΄λ„ˆλ¦¬ 파일 μ΄λ‚˜ λ°”μ΄νŠΈμ—΄λ₯˜ 객체둜 λΆ€ν„°μ˜) λ°”μ΄νŠΈ μŠ€νŠΈλ¦Όμ„ 객체 계측 ꡬ쑰둜 λ³΅μ›ν•©λ‹ˆλ‹€.

import pickle

1. pickle.dump(obj, file, protocol=None)

: 피클 λͺ¨λ“ˆλ‘œ μ €μž₯ν•˜κΈ° β†’ 객체 objλ₯Ό μ§λ ¬ν™”ν•˜μ—¬ 파일 file에 μ €μž₯ν•©λ‹ˆλ‹€.

βœ… 파일 μ˜€ν”ˆν•  λ•Œ with ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ λͺ…μ‹œμ μœΌλ‘œ νŒŒμΌμ„ λ‹«μ§€ μ•Šμ•„λ„ λ©λ‹ˆλ‹€. with 블둝을 λ– λ‚˜λŠ” μ‹œμ μ— λ‹«λŠ” λ™μž‘μ΄ μˆ˜ν–‰λ˜κΈ° λ•Œλ¬Έμ— μ˜ˆμ™Έ λ˜λŠ” μ€‘λ‹¨μ‹œμ—λ„ 파일이 λ‹«νžˆκ²Œ λ©λ‹ˆλ‹€.

βœ… wb λŠ” write binaryλ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. μ €μž₯ν•  데이터λ₯Ό 생성할 νŒŒμΌμ— μ λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

μ €λŠ” saved_model.pkl μ΄λΌλŠ” 파일 μ΄λ¦„μœΌλ‘œ μ €μž₯ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

def save():
    # 파일둜 μ €μž₯
    with open('saved_model.pkl', 'wb') as f:
        pickle.dump(model, f)
    return {"Saved": "OK"}

2. pickle.load(file)

: 피클 λͺ¨λ“ˆλ‘œ 뢈러였기 β†’ νŒŒμΌμ—μ„œ μ§λ ¬ν™”λœ 객체λ₯Ό 읽어 역직렬화(볡원)ν•©λ‹ˆλ‹€.
βœ… wb λŠ” read binaryλ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
βœ… νŒŒμΌμ—μ„œ μ§λ ¬ν™”λœ 파이썬 객체λ₯Ό μ½μ–΄μ˜΅λ‹ˆλ‹€.

def load():
    global model  # βœ… FastAPI μ•±μ˜ κΈ€λ‘œλ²Œ model λ³€μˆ˜ μ‚¬μš©
    with open('saved_model.pkl', 'rb') as f:
        model = pickle.load(f)
        return {"Loaded": "OK"}

3. pickle.dumps(obj, protocol=None)

: 객체 objλ₯Ό μ§λ ¬ν™”ν•˜μ—¬ λ°”μ΄λ„ˆλ¦¬ λ¬Έμžμ—΄(bytes) 둜 λ°˜ν™˜ν•©λ‹ˆλ‹€.λ©”λͺ¨λ¦¬ λ‚΄ 데이터λ₯Ό λ³€ν™˜ν•˜λŠ” 방식
νŒŒμΌμ— μ €μž₯ν•˜μ§€ μ•Šκ³  λ©”λͺ¨λ¦¬ μƒμ—μ„œ μ§λ ¬ν™”λœ 데이터λ₯Ό λ‹€λ£° λ•Œ μœ μš©ν•©λ‹ˆλ‹€.

binary_data = pickle.dumps(data)
print(binary_data)  # b'\x80\x04\x95...'

4. pickle.loads(bytes_obj)

: pickle.dumps() 둜 μ§λ ¬ν™”λœ λ°”μ΄λ„ˆλ¦¬ 데이터λ₯Ό λ³΅μ›ν•©λ‹ˆλ‹€.λ©”λͺ¨λ¦¬ λ‚΄ 데이터λ₯Ό λ³€ν™˜ν•˜λŠ” 방식
dumps() 둜 λ³€ν™˜λœ 데이터λ₯Ό λ‹€μ‹œ μ›λž˜μ˜ 객체둜 λ³€ν™˜ν•©λ‹ˆλ‹€.

original_data = pickle.loads(binary_data)
print(original_data)  # {'name': 'Alice', 'age': 25, 'city': 'Seoul'}

⚠️ pickle μ‚¬μš© μ‹œ μ£Όμ˜ν•  점

  1. λ³΄μ•ˆ μœ„ν—˜
    pickle.load()λ₯Ό μ‚¬μš©ν•  λ•Œ μ‹ λ’°ν•  수 μ—†λŠ” μ†ŒμŠ€μ—μ„œ 받은 νŒŒμΌμ„ λ‘œλ“œν•˜λ©΄ μ•…μ˜μ μΈ μ½”λ“œκ°€ 싀행될 μœ„ν—˜μ΄ μžˆμŠ΅λ‹ˆλ‹€.
    β†’ λŒ€μ•ˆ: μ•ˆμ „ν•œ 데이터 μ €μž₯이 ν•„μš”ν•  경우 JSON(json λͺ¨λ“ˆ) μ‚¬μš© κ³ λ €

  2. 버전 문제
    파이썬 버전이 λ‹€λ₯΄λ©΄ pickle μ§λ ¬ν™”λœ 데이터λ₯Ό 볡원할 λ•Œ λ¬Έμ œκ°€ λ°œμƒν•  수 있음.

  3. ν˜Έν™˜λ˜μ§€ μ•ŠλŠ” 객체
    λͺ¨λ“  객체가 pickle둜 직렬화 κ°€λŠ₯ν•œ 것은 μ•„λ‹™λ‹ˆλ‹€.
    파일 ν•Έλ“€, μ†ŒμΌ“, μŠ€λ ˆλ“œ, λžŒλ‹€ ν•¨μˆ˜ 등은 pickle둜 μ €μž₯ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

λ³΄μ•ˆμ΄ μ€‘μš”ν•œ κ²½μš°λŠ” json을 μ‚¬μš©ν•˜λŠ” 것이 더 μ•ˆμ „ν•˜λ‹€.


직렬화(serialization)λž€ ?
객체λ₯Ό 일련의 λ°”μ΄νŠΈ(byte)슀트림으둜 λ³€ν™˜ν•˜λŠ” 과정을 μ˜λ―Έν•©λ‹ˆλ‹€. 이 과정을 톡해 객체λ₯Ό νŒŒμΌμ— μ €μž₯ν•˜κ±°λ‚˜ λ„€νŠΈμ›Œν¬λ₯Ό 톡해 전솑할 수 μžˆμŠ΅λ‹ˆλ‹€.μ§λ ¬ν™”λœΒ λ°”μ΄νŠΈΒ μŠ€νŠΈλ¦Όμ„Β λ‹€μ‹œΒ κ°μ²΄λ‘œΒ λ³€ν™˜ν•˜λŠ”Β κ²ƒμ„Β μ—­μ§λ ¬ν™”(deserialization)λΌκ³ Β ν•©λ‹ˆλ‹€.


μ°Έκ³ 
Python pickle

profile
μ›Ή κ°œλ°œν•˜λ©° 데이터 뢄석, AI κ³΅λΆ€ν•˜λŠ” jinveloper

0개의 λŒ“κΈ€