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()