Модуль shelve Python

Для роботи з бінарними файлами в Python може застосовуватися ще один модуль - shelve. Він зберігає об'єкти в файл з певним ключем. Потім по цьому ключу може витягти раніше збережений об'єкт з файлу. Процес роботи з даними через модуль shelve нагадує роботу зі словниками, які також використовують ключі для збереження і вилучення об'єктів.

Для відкриття файлу модуль shelve використовує функцію open():

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

Де параметр flag може приймати значення:

  • c: файл відкривається для читання і запису (значення за замовчуванням). Якщо файл не існує, то він створюється.
  • r: файл відкривається тільки для читання.
  • w: файл відкривається для запису.
  • n: файл відкривається для запису Якщо файл не існує, то він створюється. Якщо він існує, то він перезаписується

Для закриття підключення до файлу викликається метод close():

import shelve  
d = shelve.open(filename)  
d. close()

Або можна відкривати файл за допомогою оператора with. Збережемо і прочитаємо у файл кілька об'єктів:

import shelve     

FILENAME = " states2"  
with shelve.open (FILENAME) as states:  
    states["London"] = "Great Britain"  
    states["Paris"] = "France"  
    states["Berlin"] = "Germany"  
    states["Madrid"] = "Spain"     

with shelve.open (FILENAME) as states:  
    print(states["London"])  
    print(states["Madrid"])  

Запис даних передбачає встановлення значення для певного ключа:

states["London"] = "Great Britain"  

А читання з файлу еквівалентно отриманню значення по ключу:

print(states["London"])  

В якості ключів використовуються строкові значення.

При читанні даних, якщо запитуваний ключ відсутній, то генерується виняток. У цьому випадку перед отриманням ми можемо перевіряти на наявність ключа за допомогою оператора in:

with shelve.open (FILENAME) as states:  
    key = "Brussels"  
    if key in states:  
        print(states[key])

Також ми можемо використовувати метод get(). Перший параметр методу - ключ, за яким слід отримати значення, а другий-значення за замовчуванням, яке повертається, якщо ключ не знайдений.

with shelve.open (FILENAME) as states:  
    state = states.get("Brussels", "Undefined") 
    print(state)  

Використовуючи цикл for, можна перебрати всі значення з файлу:

with shelve.open (FILENAME) as states:  
    for key in states:  
        print(key," - ", states[key]) 

Метод keys() повертає всі ключі з файлу, а метод values() - всі значення:

with shelve.open (FILENAME) as states:     

    for city in states.keys():  
        print(city, end=" ") # London Paris Berlin Madrid   
    print()  
    for country in states.values():  
        print(country, end=" ") # Great Britain France Germany Spain   

Ще один метод items() повертає набір кортежів. Кожен кортеж містить ключ і значення.

with shelve.open (FILENAME) as states:     

    for state in states.items():  
        print(state)

Консольний висновок:

("London", "Great Britain")
("Paris", "France")
("Berlin", "Germany")
("Madrid", "Spain")

Оновлення даних

Для зміни даних досить привласнити по ключу нове значення, а для додавання даних - визначити новий ключ:

import shelve     

FILENAME = " states2"  
with shelve.open (FILENAME) as states: 
    states["London"] = "Great Britain"  
    states["Paris"] = "France"  
    states["Berlin"] = "Germany"  
    states["Madrid"] = "Spain"     

with shelve.open (FILENAME) as states:  
    states["London"] = "United Kingdom"  
    states["Brussels"] = "Belgium"  
    for key in states:  
        print(key, " - ", states[key]) 

Видалення даних

Для видалення з одночасним отриманням можна використовувати функцію pop(), в яку передається ключ елемента і значення за замовчуванням, якщо ключ не знайдено:

with shelve.open (FILENAME) as states:  
    state = states.pop("London", "NotFound")  
    print(state) 

Також для видалення може застосовуватися оператор del:

with shelve.open (FILENAME) as states:  
    del states["Madrid"] # видаляємо об'єкт з ключем Madrid  

Для видалення всіх елементів можна використовувати метод clear():

with shelve.open (FILENAME) as states:  
    states.clear()