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

파이썬 shelve 모듈로 구현하는 객체 영속성 저장 완벽 가이드

shelve 모듈이란?

파이썬 표준 라이브러리의 shelve 모듈은 관계형 데이터베이스까지 도입할 필요가 없는 상황에서 데이터를 간편하게 영속적으로 저장할 수 있게 해주는 도구입니다. 이 모듈이 제공하는 shelf 객체는 딕셔너리와 거의 같은 방식으로 동작하면서도 그 내용이 디스크 파일에 저장된다는 점이 특징입니다. 생성되는 파일은 UNIX 계열 시스템의 dbm 데이터베이스와 유사한 형태입니다.

다만 이 특수한 딕셔너리 객체에서는 키(key)로 문자열 타입만 사용할 수 있다는 점에 유의해야 하며, 값(value)에는 pickle로 직렬화 가능한(picklable) 어떤 객체든 자유롭게 사용할 수 있습니다.

shelve 모듈의 주요 클래스

shelve 모듈은 다음 세 가지 클래스를 정의합니다.

번호클래스 및 설명
1Shelf
shelf 구현의 기본(base) 클래스입니다. 딕셔너리와 유사한(dict-like) 객체로 초기화됩니다.
2BsdDbShelf
Shelf 클래스의 서브클래스입니다. 생성자에 전달되는 dict 객체는 first(), next(), previous(), last(), set_location() 메서드를 반드시 지원해야 합니다.
3DbfilenameShelf
역시 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 객체의 주요 메서드

번호메서드 및 설명
1close()
영속 딕셔너리 객체를 동기화한 뒤 닫습니다.
2sync()
writeback=True로 shelf를 연 경우, 캐시에 있는 모든 항목을 디스크에 기록합니다.
3get()
특정 키에 연결된 값을 반환합니다.
4items()
(키, 값) 쌍으로 이루어진 튜플 목록(뷰)을 반환합니다.
5keys()
shelf의 키 목록(뷰)을 반환합니다.
6pop()
지정한 키를 제거하고 해당 값을 반환합니다.
7update()
다른 딕셔너리나 iterable의 내용으로 shelf를 갱신합니다.
8values()
shelf의 값 목록(뷰)을 반환합니다.

값 읽기와 수정

shelf에 저장된 특정 키의 값에 접근하려면 일반 딕셔너리처럼 인덱싱하거나 get() 메서드를 사용합니다.

>>> s = shelve.open('test')
>>> s['age']
23
>>> s['age'] = 25
>>> s.get('age')
25

items(), 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는 딕셔너리 객체를 손쉽게 영속적으로 저장할 수 있는 편리한 메커니즘을 제공하므로, 간단한 설정 정보나 소규모 데이터를 파일 기반으로 관리할 때 유용하게 활용할 수 있습니다.