Сообщить об ошибке.

Функция open() модуля shelve в Python

Открывает key-value хранилище shelve

Синтаксис:

import shelve

db = shelve.open(filename, flag='c', protocol=None, writeback=False)

Параметры:

  • filename - имя файла хранилища,
  • flag='c' - режим открытия хранилища,
  • protocol=None - протокол pickle,
  • writeback=False - кэширование записей в памяти.

Возвращаемое значение:

Описание:

Функция open() модуля shelve открывает постоянное key-value хранилище как словарь.

Указанное имя файла filename является базовым именем для базы данных. Как побочный эффект, может быть добавлено расширение к имени файла и может быть создано более одного файла. По умолчанию основной файл базы данных открыт для чтения и записи.

Необязательный параметр flag имеет ту же интерпретацию, что и параметр flag функции dbm.open().

По умолчанию используются протокол 3 pickle для сериализации значений. Версия протокола pickle может быть указана с помощью параметра protocol.

Из-за семантики Python, shelve не может знать, когда изменяется запись постоянного key-value хранилища. По умолчанию измененные объекты записываются только при ПРИСВАИВАНИИ значений ключам.

Если для необязательного параметра обратной записи writeback установлено значение True, то все записи, к которым осуществляется доступ, кэшируются в памяти и записываются обратно при помощи db.sync() в момент закрытия хранилища db.close(). Это может сделать его более удобным для изменения записей в хранилище, но если доступ осуществляется ко многим записям, то shelve может потреблять огромные объемы памяти для кэша, что может сделать операцию закрытия очень медленной, так как все записи, к которым осуществляется доступ, записываются обратно.

Объекты shelve поддерживают все методы, поддерживаемые словарями. Это облегчает переход от сценариев на основе словаря к тем, которые требуют постоянного хранения.

Изменено в Python 3.10: pickle.DEFAULT_PROTOCOL теперь используется как протокол pickle по умолчанию.

Примечание:

Не полагайтесь на то, что key-value хранилище shelve закрывается автоматически. Всегда вызывайте db.close() явно, когда он больше не нужен или используйте shelve.open() в качестве менеджера контекста.

import shelve

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

Предупреждение.

Поскольку модуль shelve полки поддерживается с помощью pickle, загружать shelve-хранилище из ненадежного источника небезопасно. Как и в случае с pickle, загрузка shelve может выполнить произвольный код.

Методы открытого хранилища.

db.sync():

Метод db.sync() записывает все записи из кеша в постоянный словарь на диске, если хранилище shelve было открыто с writeback=False. Очищает кеш и синхронизирует хранилище, если это возможно. Метод вызывается автоматически, когда хранилище shelve закрывается с помощью метода db.close().

db.close():

Метод db.close() синхронизирует и закрывает постоянный объект dict. Этот метод завершатся с ошибкой ValueError, если хранилище shelve уже закрыто.

Примеры использования:

import shelve

# создадим хранилище и запишем некоторые значения
with shelve.open('test.db') as db:
    db['key1'] = {'int': 10, 'float': 9.5, 'string': 'Sample data'}
    db['key2'] = [1, 5, 10]

def func():
    print('This is func()')

# обновляем данные в хранилище
with shelve.open('test.db') as db:
    tmp = db['key1']
    tmp['spam'] = {'func': func}
    db['key1'] = tmp
    tmp = db['key2']
    tmp.append(20)
    db['key2'] = tmp

with shelve.open('test.db') as db:
    d = db['key1']
    l = db['key2']

>>> l
# [1, 5, 10, 20]
>>> d
# {
# 'int': 10, 
# 'float': 9.5, 
# 'string': 'Sample data', 
# 'spam': {'func': <function func at 0x7f662d22e6a8>}
# }
>>> d['spam']['func']()
# This is func()