На этом шаге мы рассмотрим функции сохранения объектов в файл, предоставляемые этим модулем.
Модуль shelve позволяет сохранять объекты под определенным ключом (задается в виде строки) и предоставляет интерфейс доступа, сходный со словарями. Для сериализации объекта используются возможности модуля pickle, а чтобы записать получившуюся строку по ключу в файл, применяется модуль dbm. Все эти действия модуль shelve производит самостоятельно.
Открыть файл с набором объектов поможет функция open(). Функция имеет следующий формат:
open(<Путь к файлу>[, flag="c"][, protocol=None][, writeback=False])
В необязательном параметре flag можно указать один из режимов открытия файла:
Функция open () возвращает объект, с помощью которого производится дальнейшая работа с базой данных. Этот объект имеет следующие методы:
>>> import shelve # Подключаем модуль >>> db = shelve.open("db1") # Открываем файл >>> db["obj1"] = [1,2,3,4,5] # Сохраняем список >>> db["obj2"] = (6,7,8,9,10) # Сохраняем кортеж >>> db["obj1"], db["obj2"] # Вывод значений ([1, 2, 3, 4, 5], (6, 7, 8, 9, 10)) >>> db. close () # Закрываем файл
>>> db = shelve.open ("db1") >>> db.keys(), db.values() (KeysView(<shelve.DbfilenameShelf object at 0x0245D590>), ValuesView(<shelve.DbfilenameShelf object at 0x0245D590>)) >>> list (db.keys()) , list (db.values()) (['obj1', 'obj2'], [[1, 2, 3, 4, 5], (6, 7, 8, 9, 10)]) >>> db.items() ItemsView(<shelve.DbfilenameShelf object at 0x0245D590>) >>> list (db.items()) [('obj1', [1, 2, 3, 4, 5]), ('obj2', (6, 7, 8, 9, 10))] >>> db.close()
update (<Ключ1>=<Значение1>[, ..., <КлючN>=<ЗначениеN>]) update (<Словарь>) update (<Список кортежей с двумя элементами>) update (<Список списков с двумя элементами>)
Помимо этих методов можно воспользоваться функцией len () для получения количества элементов и оператором del для удаления определенного элемента, а также операторами in и not in для проверки существования или несуществования ключа. Пример:
>>> db = shelve.open("db1") >>> len(db) # Количество элементов 2 >>> "obj1" in db True >>> del db["obj1"] # Удаление элемента >>> "obj1" in db False >>> "obj1" not in db True >>> db.close()
В заключение дадим краткое описание использованных параметров. Параметр protocol определяет протокол функции pickle(). Более интересным является назначение параметра writeback. Если его значение равно False (по умолчанию), то измения элемента не будут сохранены автоматически, в отличие от значения True, однако в этом случае могут быть задействованы достаточно большие ресурсы, и программа будет работать медленно.
Рассмотрим эту особенность на конкретном примере:
>>> db = shelve.open("db1") # Пареметр writeback=False >>> db["db1"] = [0, 1, 2] # Добавим еще один элемент >>> db["db1"] # Выведем его значение [0, 1, 2] >>> db["db1"].append(3) # Добавили элемент в список >>> db["db1"] # Выведем его значение. Добавления не произошло!!! [0, 1, 2] >>> temp = db["db1"] # Поместим элемент в переменную >>> temp.append(3) # Выполним здесь добавление... >>> db["db1"] = temp # ... и присваивание >>> db["db1"] # Выведем его значение. Все получилось!!! [0, 1, 2, 3] >>> db.close() >>> db = shelve.open("db1", writeback = True) # Пареметр writeback=True >>> db["db1"] # Выведем значение элемента [0, 1, 2, 3] >>> db["db1"].append(4) # Добавили элемент в список >>> db["db1"] # Выведем его значение. Все получилось!!! [0, 1, 2, 3, 4] >>> db.close()
На следующем шаге мы рассмотрим функции для работы с каталогами.