shelve 모듈이란?
파이썬 표준 라이브러리의 shelve 모듈은 관계형 데이터베이스까지 도입할 필요가 없는 상황에서 데이터를 간편하게 영속적으로 저장할 수 있게 해주는 도구입니다. 이 모듈이 제공하는 shelf 객체는 딕셔너리와 거의 같은 방식으로 동작하면서도 그 내용이 디스크 파일에 저장된다는 점이 특징입니다. 생성되는 파일은 UNIX 계열 시스템의 dbm 데이터베이스와 유사한 형태입니다.
다만 이 특수한 딕셔너리 객체에서는 키(key)로 문자열 타입만 사용할 수 있다는 점에 유의해야 하며, 값(value)에는 pickle로 직렬화 가능한(picklable) 어떤 객체든 자유롭게 사용할 수 있습니다.
shelve 모듈의 주요 클래스
shelve 모듈은 다음 세 가지 클래스를 정의합니다.
| 번호 | 클래스 및 설명 |
|---|---|
| 1 | Shelf shelf 구현의 기본(base) 클래스입니다. 딕셔너리와 유사한(dict-like) 객체로 초기화됩니다. |
| 2 | BsdDbShelf Shelf 클래스의 서브클래스입니다. 생성자에 전달되는 dict 객체는 first(), next(), previous(), last(), set_location() 메서드를 반드시 지원해야 합니다. |
| 3 | DbfilenameShelf 역시 Shelf의 서브클래스지만, dict 객체 대신 파일명(filename)을 생성자 매개변수로 받습니다. |
shelf 객체 생성하기
Shelf 객체를 만드는 가장 쉬운 방법은 shelve 모듈에 정의된 open() 함수를 사용하는 것입니다. 이 함수는 DbfilenameShelf 객체를 반환합니다.
open(filename, flag='c', protocol=None, writeback=False)
각 매개변수의 의미는 다음과 같습니다.
- filename: 생성할 데이터베이스 파일의 이름입니다.
- flag: 기본값은 'c'로 읽기/쓰기 접근을 의미합니다. 그 외에 'w'(쓰기 전용), 'r'(읽기 전용), 'n'(새 파일 생성 후 읽기/쓰기) 플래그를 사용할 수 있습니다.
- protocol: pickle 프로토콜 버전을 지정합니다.
- writeback: 기본값은 False입니다. True로 설정하면 접근한 항목들이 캐시에 저장되며, sync()와 close() 호출 시 일괄 반영됩니다. 다만 매번 동기화 작업이 수행되므로 처리 속도가 느려질 수 있습니다.
데이터 저장 예제
다음 코드는 데이터베이스를 생성하고 딕셔너리 항목들을 저장합니다.
import shelve
s = shelve.open('test')
s['name'] = 'Ajay'
s['age'] = 23
s['marks'] = 75
s.close()
이 코드를 실행하면 현재 디렉터리에 test.dir 파일이 생성되고, 키-값 데이터가 해시 형태로 저장됩니다.
Shelf 객체의 주요 메서드
| 번호 | 메서드 및 설명 |
|---|---|
| 1 | close() 영속 딕셔너리 객체를 동기화한 뒤 닫습니다. |
| 2 | sync() writeback=True로 shelf를 연 경우, 캐시에 있는 모든 항목을 디스크에 기록합니다. |
| 3 | get() 특정 키에 연결된 값을 반환합니다. |
| 4 | items() (키, 값) 쌍으로 이루어진 튜플 목록(뷰)을 반환합니다. |
| 5 | keys() shelf의 키 목록(뷰)을 반환합니다. |
| 6 | pop() 지정한 키를 제거하고 해당 값을 반환합니다. |
| 7 | update() 다른 딕셔너리나 iterable의 내용으로 shelf를 갱신합니다. |
| 8 | values() shelf의 값 목록(뷰)을 반환합니다. |
값 읽기와 수정
shelf에 저장된 특정 키의 값에 접근하려면 일반 딕셔너리처럼 인덱싱하거나 get() 메서드를 사용합니다.
>>> s = shelve.open('test')
>>> s['age']
23
>>> s['age'] = 25
>>> s.get('age')
25items(), keys(), values() 메서드는 뷰(view) 객체를 반환하므로 list()로 변환해 확인할 수 있습니다.
>>> list(s.items())
[('name', 'Ajay'), ('age', 25), ('marks', 75)]
>>> list(s.keys())
['name', 'age', 'marks']
>>> list(s.values())
['Ajay', 25, 75]
항목 삭제와 병합
pop() 메서드를 사용하면 키-값 쌍을 제거할 수 있습니다.
>>> s.pop('marks')
75
>>> list(s.items())
[('name', 'Ajay'), ('age', 25)]실행 결과에서 marks-75 쌍이 제거된 것을 확인할 수 있습니다.
다른 딕셔너리의 항목을 shelf에 병합하려면 update() 메서드를 사용합니다.
>>> d = {'salary': 10000, 'designation': 'manager'}
>>> s.update(d)
>>> list(s.items())
[('name', 'Ajay'), ('age', 25), ('salary', 10000), ('designation', 'manager')]마무리
이 글에서는 파이썬의 shelve 모듈을 살펴보았습니다. shelve는 딕셔너리 객체를 손쉽게 영속적으로 저장할 수 있는 편리한 메커니즘을 제공하므로, 간단한 설정 정보나 소규모 데이터를 파일 기반으로 관리할 때 유용하게 활용할 수 있습니다.