Шаг 173.
Основы языка Python.
Работа с файлами и каталогами. Сохранение объектов в файл. Модуль shelve

    На этом шаге мы рассмотрим функции сохранения объектов в файл, предоставляемые этим модулем.

    Модуль shelve позволяет сохранять объекты под определенным ключом (задается в виде строки) и предоставляет интерфейс доступа, сходный со словарями. Для сериализации объекта используются возможности модуля pickle, а чтобы записать получившуюся строку по ключу в файл, применяется модуль dbm. Все эти действия модуль shelve производит самостоятельно.

    Открыть файл с набором объектов поможет функция open(). Функция имеет следующий формат:

  open(<Путь к файлу>[, flag="c"][, protocol=None][, writeback=False])

    В необязательном параметре flag можно указать один из режимов открытия файла:

    Функция open () возвращает объект, с помощью которого производится дальнейшая работа с базой данных. Этот объект имеет следующие методы:

    Помимо этих методов можно воспользоваться функцией 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()

    На следующем шаге мы рассмотрим функции для работы с каталогами.




Предыдущий шаг Содержание Следующий шаг