수색…


소개

Shelve는 객체를 파일에 저장하는 데 사용되는 파이썬 모듈입니다. shelve 모듈은 사전과 비슷한 API를 사용하여 피클링 할 수있는 임의의 Python 객체에 영구 저장소를 구현합니다. 쉘브 모듈은 관계형 데이터베이스가 과도하게 사용되는 경우 Python 객체에 대한 간단한 영구 저장 옵션으로 사용할 수 있습니다. 사전과 마찬가지로 키로 선반에 액세스 할 수 있습니다. 값은 picked되고 anydbm에 의해 작성되고 관리되는 데이터베이스에 기록됩니다.

비고

참고 : 선반이 자동으로 닫히지 않도록하십시오. 더 이상 필요하지 않으면 항상 close() 명시 적으로 호출하거나 컨텍스트 관리자로 shelve.open() 을 사용 shelve.open() .

with shelve.open('spam') as db:
    db['eggs'] = 'eggs'

경고:

shelve 모듈은 pickle 로지지되므로 신뢰할 수없는 출처의 선반을로드하는 것은 안전하지 않습니다. pickle과 마찬가지로 선반을 로딩하면 임의의 코드를 실행할 수 있습니다.

제한 사항

1 . 사용되는 데이터베이스 패키지 (dbm.ndbm 또는 dbm.gnu 등)의 선택은 사용 가능한 인터페이스에 따라 다릅니다. 따라서 dbm을 사용하여 데이터베이스를 직접 여는 것은 안전하지 않습니다. 데이터베이스는 또한 (불행하게도) dbm이 사용된다면 제한을받습니다. 즉, 데이터베이스에 저장된 객체는 상당히 작아야하며, 드문 경우이지만 키 충돌로 인해 데이터베이스가 업데이트를 거부합니다.

2. 쉘브 모듈은 쉘빙 된 객체에 대한 동시 읽기 / 쓰기 액세스를 지원하지 않습니다. (여러 동시 읽기 액세스는 안전합니다.) 프로그램에 쓰기 용 선반이 열려 있으면 다른 프로그램에서 읽기 또는 쓰기 용으로 열어서는 안됩니다. Unix 파일 잠금은이 문제를 해결하는 데 사용할 수 있지만 유닉스 버전마다 다르며 사용 된 데이터베이스 구현에 대한 지식이 필요합니다.

선반의 샘플 코드

객체를 분리하려면 먼저 모듈을 가져온 다음 다음과 같이 객체 값을 할당합니다.

import shelve 
 database = shelve.open(filename.suffix) 
 object = Object() 
 database['key'] = object 

인터페이스 요약 (키는 문자열 임, 데이터는 임의의 객체 임) :

import shelve

d = shelve.open(filename)  # open -- file may get suffix added by low-level
                           # library

d[key] = data              # store data at key (overwrites old data if
                           # using an existing key)
data = d[key]              # retrieve a COPY of data at key (raise KeyError
                           # if no such key)
del d[key]                 # delete data stored at key (raises KeyError
                           # if no such key)

flag = key in d            # true if the key exists
klist = list(d.keys())     # a list of all existing keys (slow!)

# as d was opened WITHOUT writeback=True, beware:
d['xx'] = [0, 1, 2]        # this works as expected, but...
d['xx'].append(3)          # *this doesn't!* -- d['xx'] is STILL [0, 1, 2]!

# having opened d without writeback=True, you need to code carefully:
temp = d['xx']             # extracts the copy
temp.append(5)             # mutates the copy
d['xx'] = temp             # stores the copy right back, to persist it

# or, d=shelve.open(filename,writeback=True) would let you just code
# d['xx'].append(5) and have it work as expected, BUT it would also
# consume more memory and make the d.close() operation slower.

d.close()                  # close it

새로운 선반 만들기

shelve를 사용하는 가장 간단한 방법은 DbfilenameShelf 클래스를 사용하는 것입니다. anydbm을 사용하여 데이터를 저장합니다. 클래스를 직접 사용하거나 단순히 shelve.open ()을 호출 할 수 있습니다.

import shelve

s = shelve.open('test_shelf.db')
try:
    s['key1'] = { 'int': 10, 'float':9.5, 'string':'Sample data' }
finally:
    s.close()

데이터에 다시 액세스하려면 선반을 열고 사전과 같이 사용하십시오.

    import shelve
    
    s = shelve.open('test_shelf.db')
    try:
        existing = s['key1']
    finally:
        s.close()

print existing

두 샘플 스크립트를 모두 실행하면 다음과 같이 표시됩니다.

$ python shelve_create.py
$ python shelve_existing.py

{'int': 10, 'float': 9.5, 'string': 'Sample data'}

dbm 모듈은 동시에 동일한 데이터베이스에 작성하는 여러 응용 프로그램을 지원하지 않습니다. 클라이언트가 선반을 수정하지 않는다는 것을 알고 있으면 shelve에게 데이터베이스를 읽기 전용으로 열도록 지시 할 수 있습니다.

import shelve

s = shelve.open('test_shelf.db', flag='r')
try:
    existing = s['key1']
finally:
    s.close()

print existing

프로그램이 읽기 전용으로 열려있는 동안 데이터베이스를 수정하려고하면 액세스 오류 예외가 생성됩니다. 예외 유형은 데이터베이스가 작성 될 때 anydbm이 선택한 데이터베이스 모듈에 따라 다 (니다.

다시 쓰기

선반은 휘발성 개체에 대한 수정 내용을 기본적으로 추적하지 않습니다. 즉, 선반에 저장된 항목의 내용을 변경하는 경우 항목을 다시 저장하여 선반을 명시 적으로 업데이트해야합니다.

import shelve

s = shelve.open('test_shelf.db')
try:
    print s['key1']
    s['key1']['new_value'] = 'this was not here before'
finally:
    s.close()

s = shelve.open('test_shelf.db', writeback=True)
try:
    print s['key1']
finally:
    s.close()

이 예에서 'key1'의 사전은 다시 저장되지 않으므로 선반을 다시 열면 변경 사항이 보존되지 않습니다.

$ python shelve_create.py
$ python shelve_withoutwriteback.py

{'int': 10, 'float': 9.5, 'string': 'Sample data'}
{'int': 10, 'float': 9.5, 'string': 'Sample data'}

선반에 저장된 휘발성 객체에 대한 변경 사항을 자동으로 잡으려면 쓰기 저장이 활성화 된 선반을 엽니 다. writeback 플래그는 쉘프가 메모리 내 캐시를 사용하여 데이터베이스에서 검색된 모든 객체를 기억하도록합니다. 각 캐시 오브젝트는 쉘프가 닫힐 때 데이터베이스에 다시 기록됩니다.

import shelve

s = shelve.open('test_shelf.db', writeback=True)
try:
    print s['key1']
    s['key1']['new_value'] = 'this was not here before'
    print s['key1']
finally:
    s.close()

s = shelve.open('test_shelf.db', writeback=True)
try:
    print s['key1']
finally:
    s.close()

프로그래머 오류의 가능성을 줄이고 객체 지속성을보다 투명하게 만들 수 있지만 모든 상황에서 쓰기 저장 모드를 사용하는 것은 바람직하지 않을 수 있습니다. 캐시는 선반이 열려있는 동안 추가 메모리를 소비하며, 캐시 된 모든 객체를 닫을 때 데이터베이스에 다시 쓰려면 일시 중지하는 데 시간이 더 걸릴 수 있습니다. 캐시 된 객체가 수정되었는지 여부를 알 수있는 방법이 없으므로 모두 다시 기록됩니다. 응용 프로그램이 쓰는 것보다 더 많은 데이터를 읽으면 쓰기 저장이 원하는 것보다 더 많은 오버 헤드를 추가합니다.

$ python shelve_create.py
$ python shelve_writeback.py

{'int': 10, 'float': 9.5, 'string': 'Sample data'}
{'int': 10, 'new_value': 'this was not here before', 'float': 9.5, 'string': 'Sample data'}
{'int': 10, 'new_value': 'this was not here before', 'float': 9.5, 'string': 'Sample data'}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow