Использование хранилищ Python

ispolzovanie hranilishh python Базы данных и постоянное хранение

Иными словами, модуль shelve служит всего лишь посредником — он сериализует и десериализует объекты, чтобы их можно было поместить в файлы DBM. В конечном итоге хранилища позволяют записывать в файлы по ключу почти любые объекты Python и позднее загружать их обратно по тому же ключу.

Однако сами сценарии никогда не видят всех этих взаимодействий. Подобно файлам DBM хранилища предоставляют интерфейс, напоминающий словарь, который нужно открыть. Фактически хранилища — это всего лишь постоянно хранимые словари с постоянно хранимыми объектами Python: содержимое словарей-хранилищ отображается в файлы на компьютере, благодаря чему они сохраняются между запусками программы. На словах все это звучит довольно сложно, но в программном коде оказывается просто. Чтобы получить доступ к хранилищу, импортируйте модуль и откройте свой файл:

import shelve

dbase = shelve.open("mydbase")

Модуль shelve откроет файл DBM с именем mydbase или создаст его, если он еще не существует (по умолчанию он использует режим ‘c’ открытия файлов DBM). Операция присваивания по ключу сохраняет объект:

dbase[‘key‘] = object # сохранить объект

Внутренне эта операция преобразует объект в сериализованный поток байтов и запишет его по ключу в файл DBM. Обращение к хранилищу по ключу загружает сохраненный объект:

value = dbase[‘key‘] # извлечь объект

Внутренне эта операция обращения по индексу загрузит по ключу строку из файла DBM и развернет ее в объект в памяти, совпадающий с исходным объектом. Здесь также поддерживается большинство операций со словарями:

len(dbase) # количество хранящихся элементов

dbase.keys() # список ключей хранящихся элементов

И, за исключением некоторых тонких моментов, это все, что касается использования модуля shelve. Хранилища объектов обрабатываются с использованием обычного синтаксиса словарей Python, поэтому не нужно изучать новый интерфейс базы данных. Более того, объекты, сохраняемые в хранилищах и извлекаемые из них, являются обычными объектами Python. Для сохранения не требуется, чтобы они были экземплярами особых классов или типов. То есть система постоянного
хранения объектов Python является внешней по отношению к самим сохраняемым объектам. В табл. 17.2 сведены вместе эти и другие часто используемые операции с хранилищами.

Табли ца 17.2. Опера ции с файла ми хра ни лищ

Программный код Python

Действие

Описание

import shelve

Импорт

Получить интерфейс bsddb, gdbm и так далее в зависимости от того, что установлено

file=shelve.open(‘filename’)

Открытие

Создать или открыть существующий файл DBM хранилища

file[‘key’] = anyvalue

Запись

Создать или изменить запись с ключом key

value = file[‘key’]

Выборка

Загрузить значение из записи с ключом key

count = len(file)

Размер

Получить количество записей

index = file.keys()

Индекс

Получить список ключей (итерируемое представление)

found = ‘key’ in file

Запрос

Проверить наличие записи с ключом key

del file[‘key’]

Удаление

Удалить запись с ключом key

for key in file:

Итерации

Выполнить итерации по имеющимся ключам

file.close()

Закрытие

Закрыть вручную, требуется не всегда

 

Так как хранилища тоже экспортируют интерфейс, подобный словарю, эта таблица почти идентична таблице операций с файлами DBM. Однако здесь имя модуля dbm заменяется на shelve, вызовы open не требуют второго аргумента ‘c’, а сохраняемые значения могут быть объектами практически любых типов, а не просто строками. Однако ключами все еще могут быть только строки (технически ключами могут быть только объекты str, которые автоматически преобразуются в тип bytes и обратно с применением кодировки UTF-8), и для надежности по-прежнему необходимо явно закрывать хранилища после проведенных изменений: хранилища внутренне используют модуль dbm, а некоторые базовые модули поддержки DBM требуют выполнять закрытие, чтобы избежать потери или повреждения данных.

По след ние из ме не ния: Функции открытия хранилища в модуле shelve теперь принимают необязательный аргумент writeback — если в нем передать значение True, все записи будут кэшироваться в памяти и записываться обратно на диск только при выполнении операции закрытия. Это устраняет необходимость вручную повторно присваивать модифицированные изменяемые объекты, чтобы вытолкнуть их на диск, но может приводить к непроизводительным потерям при большом количестве записей — кэш может занять огромный объем памяти, и операция закрытия в таких случаях будет выполняться достаточно медленно, так как необходимо будет записать в файл все извлеченные записи (интерпретатор не способен определить, какие из записей изменялись).Помимо того что значениями могут быть не только простые строки, но и любые объекты, интерфейс хранилищ в Python 3.X имеет еще два тонких отличия от интерфейса файлов DBM. Во-первых, метод keys возвращает итерируемый объект пред став ле ния (а не физический список). Во-вторых, значениями клю чей всегда являются строки типа str, а не bytes — при извлечении, записи, удалении и в других операциях используемые ключи типа str кодируются в строки bytes, которые ожидает получить реализация DBM, с использованием кодировки UTF-8. Это означает, что в отличие от модуля dbm, нельзя в качестве ключей хранилища shelve использовать строки bytes, чтобы использовать произвольные кодировки.

Кроме того, ключи хранилищ декодируются из типа bytes в тип str с помощью кодировки UTF-8 всякий раз, когда они возвращаются функциями модуля shelve (например, при выполнении итераций по ключам). Хранимые значения всегда представлены объектами bytes, создаваемыми модулем pickle при сериализации объектов. Мы увидим эти особенности в действии, далее в этом разделе.

Использованная литература:

Марк Лутц — Программирование на Python, 4-е издание, II том, 2011

Каталог сайтов Всего.ру
Оцените статью
Секреты программирования
Добавить комментарий