시리얼라이제이션의 기본 개념
파이썬에서 데이터를 파일이나 네트워크를 통해 저장하거나 전송하기 위해선 객체를 직렬화해야 합니다. 주로 사용되는 세 가지 내장 모듈은 json, pickle, shelve입니다.
1. JSON 모듈: 인간이 읽을 수 있는 형식으로 데이터 변환
json은 자바스크립트 객체 표기법과 호환되며, 문자열과 파이썬 기본 타입 간에 변환을 지원합니다. 주요 함수는 다음과 같습니다:
dumps(): 파이썬 객체를 문자열로 변환loads(): 문자열을 파이썬 객체로 복원dump(): 객체를 파일에 직렬화load(): 파일에서 데이터를 읽어와 객체로 변환
import json
data = {"key": "value"}
serialized = json.dumps(data)
print(serialized) # {"key": "value"}
deserialized = json.loads(serialized)
print(deserialized) # {'key': 'value'}
2. Pickle 모듈: 파이썬 고유 타입 직렬화
pickle는 파이썬만의 복잡한 타입(함수, 클래스 인스턴스 등)도 직렬화할 수 있습니다. 하지만 출력은 바이너리 형식이며, 다른 언어와 호환되지 않습니다.
import pickle
obj = [1, 2, 3, 'hello']
binary_data = pickle.dumps(obj)
print(binary_data) # b'\x80\x03]q\x00(K\x01K\x02K\x03X\x05\x00\x00\x00helloe.'
restored = pickle.loads(binary_data)
print(restored) # [1, 2, 3, 'hello']
파일로 저장/불러오기 시에는 반드시 바이너리 모드로 열어야 합니다:
with open('data.bin', 'wb') as f:
pickle.dump([1, 2, 3], f)
with open('data.bin', 'rb') as f:
loaded_data = pickle.load(f)
print(loaded_data) # [1, 2, 3]
3. Shelve 모듈: 딕셔너리처럼 동작하는 파일 기반 저장소
shelve는 간단한 키-값 저장을 위한 래퍼입니다. 내부적으로 pickle를 사용하지만, 딕셔너리처럼 접근 가능하며, 파일에 영구 저장됩니다.
import shelve
# 데이터 저장
with shelve.open('config.db', 'c') as db:
db['site'] = 'https://example.com'
db['user'] = {'name': 'Alice', 'age': 30}
# 데이터 읽기
with shelve.open('config.db', 'r') as db:
print(db['site']) # https://example.com
print(db['user']) # {'name': 'Alice', 'age': 30}
업데이트도 가능하며, 변경 사항은 자동으로 반영됩니다:
with shelve.open('inventory.db', 'c') as db:
if 'products' not in db:
db['products'] = {}
products = db['products']
products.update({'laptop': 1200, 'mouse': 25})
db['products'] = products